RocketMQ入门到入土(四)producer生产消息源码剖析
篇幅不是每一行代码都进行解析,没意义。冗余的文字你看着烦我写着也闹心,只剖析核心流程以及原理。
一、Demo
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
/**
-
Description:
-
@author TongWei.Chen 2020-06-21 11:32:58
*/
public class ProducerDemo {
public static void main(String[] args) throws Exception {
DefaultMQProducer producer = new DefaultMQProducer(“my-producer”);
producer.setNamesrvAddr(“124.57.180.156:9876”);
producer.start();Message msg = new Message("myTopic001", "hello world".getBytes()); SendResult result = producer.send(msg); System.out.println("发送消息成功!result is : " + result);
}
}
二、源码剖析
1、准备工作
1.1、new DefaultMQProducer()
public DefaultMQProducer(final String producerGroup) {
this(null, producerGroup, null);
}
public DefaultMQProducer(final String namespace, final String producerGroup, RPCHook rpcHook) {
// null
this.namespace = namespace;
// my-producer
this.producerGroup = producerGroup;
// new DefaultMQProducerImpl(this, null);
defaultMQProducerImpl = new DefaultMQProducerImpl(this, rpcHook);
}
给producerGroup赋值
new DefaultMQProducerImpl()
1.2、setNamesrvAddr()
/**
- {@link org.apache.rocketmq.client.ClientConfig}
*/
public void setNamesrvAddr(String namesrvAddr) {
this.namesrvAddr = namesrvAddr;
}
给namesrv赋值
2、启动
2.1、start()
@Override
public void start() throws MQClientException {
this.defaultMQProducerImpl.start();
}
再次重申:篇幅不是每一行代码都进行解析,没意义。冗余的文字你看着烦我写着也闹心,只剖析核心流程以及原理。所以删减了无用的垃圾。
2.1.1、defaultMQProducerImpl.start()
private ServiceState serviceState = ServiceState.CREATE_JUST;
public void start(final boolean startFactory) throws MQClientException {
switch (this.serviceState) {
// 默认为CREATE_JUST状态
case CREATE_JUST:
// 先默认成启动失败,等最后完全启动成功的时候再置为ServiceState.RUNNING
this.serviceState = ServiceState.START_FAILED;
/**
* 检查配置,比如group有没有写,是不是默认的那个名字,长度是不是超出限制了,等等一系列验证。
/
this.che