在rocketmq发送端,
发送一个顺序消息的代码如图,看看都干了什么
public class OrderProducer {
public static void main(String[] args) throws InterruptedException, RemotingException, MQClientException, MQBrokerException {
DefaultMQProducer producer = new DefaultMQProducer("rocket_test_topic");
producer.setNamesrvAddr("192.168.1.229:9876;192.168.1.226:9876");
producer.start();
String[] tags = new String[] {"TagA", "TagB", "TagC", "TagD", "TagE"};
for (int i = 0; i < 10000; i++) {
Message message = new Message("rocket_test_topic",tags[0],"i"+i,("rocket_test"+i).getBytes());
SendResult send = producer.send(message, new MessageQueueSelector() {
@Override
public MessageQueue select(List<MessageQueue> list, Message message, Object o) {
Integer id = (Integer) o;
MessageQueue messageQueue = list.get(id);
return list.get(id);
}
}, i%4);//队列0
String msgId = send.getMsgId();
System.out.println(msgId+send);
TimeUnit.MILLISECONDS.sleep(3);
}
}
}
先看下producer端的启动流程
org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl#start(boolean)
public void start(final boolean startFactory) throws MQClientException {
switch (this.serviceState) {
case CREATE_JUST:
this.serviceState = ServiceState.START_FAILED;
this.checkConfig();//producerGroup验证,producerGroup不能为空,正则,长度验证等
if (!this.defaultMQProducer.getProducerGroup().equals(MixAll.CLIENT_INNER_PRODUCER_GROUP)) {
// RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();String name = runtime.getName()获取pid和本机名称
this.defaultMQProducer.changeInstanceNameToPID();//将实例名称由default改成pid,
}
// 创建MQClientInstance实例,一个jvm实例就MQClientInstance实例
this.mQClientFactory = MQClientManager.getInstance().getAndCreateMQClientInstance(this.defaultMQProducer, rpcHook);
//DefaultMQProducerImpl实例注册到producerTable
boolean registerOK = mQClientFactory.registerProducer(this.defaultMQProducer.getProducerGroup(), this);
if (!registerOK) {
this.serviceState = ServiceState.CREATE_JUST;
throw new MQClientException("The producer group[" + this.defaultMQProducer.getProducerGroup()
+ "] has been created before, specify another name please." + FAQUrl.suggestTodo(FAQUrl.GROUP_NAME_DUPLICATE_URL),
null);
}
//topicPublishInfoTable路由信息放入TBW102,创建的
this.topicPublishInfoTable.put(this.defaultMQProducer.getCreateTopicKey(), new TopicPublishInfo());
if (startFactory) {//传进来就是true
mQClientFactory.start();//对mqclieninstance就行一次start方法, #1
}
log.info("the producer [{}] start OK. sendMessageWithVIPChannel={}", this.defaultMQProducer.getProducerGroup(),
this.defaultMQProducer.isSendMessageWithVIPChannel());
this.serviceState = ServiceState.RUNNING;
break;
case RUNNING:
case START_FAILED:
case SHUTDOWN_ALREADY:
throw new MQClientException("The producer service state not OK, maybe started once, "
+ this.serviceState
+ FAQUrl.suggestTodo(FAQUrl.CLIENT_SERVICE_NOT_OK),
null);
default:
break;
}
//发送心跳数据到所有的broker
this.mQClientFactory.sendHeartbeatToAllBrokerWithLock();
}
#1
public void start() throws MQClientException {//mqclientinstacne的初始化
synchronized (this) {
switch (this.serviceState) {
case CREATE_JUST:
this.serviceState = ServiceState.START_FAILED;
// If not specified,looking address from name server
if (null == this.clientConfig.getNamesrvAddr()) {
this.mQClientAPIImpl.fetchNameServerAddr