说明
本文所涉及的RocketMQ版本为4.7.1。
类关系
RocketMQ Producer的核心类、接口关系如下:
引自:极客时间-消息队列高手课 https://time.geekbang.org/column/article/132889
此处的设计使用了门面模式(Facade Pattern),接口 MQProducer 就是这个模式中的门面。
类 DefaultMQProducer 实现了接口 MQProducer,它里面的方法实现大多没有任何的业务逻辑,只是封装了对其他实现类的方法调用;
producer的主要实现逻辑都在DefaultMQProducerImpl 中。
接口 MQAdmin 定义了一些元数据管理的方法,在消息发送过程中会用到。
启动流程
一个典型的启动过程可以参考rocketmq源码中单元测试部分的代码,比如在DefaultMQProducerTest中的 init()
方法:
public void init() throws Exception {
String producerGroupTemp = producerGroupPrefix + System.currentTimeMillis();
producer = new DefaultMQProducer(producerGroupTemp);
producer.setNamesrvAddr("127.0.0.1:9876");
producer.setCompressMsgBodyOverHowmuch(16);
//省略构造消息代码
......
producer.start();
//省略测试相关代码
......
}
创建DefaultMQProducer、初始化部分配置参数后,就调用DefaultMQProducer#start(),而该方法实际调用的是DefaultMQProducerImpl#start(),该方法简略代码如下:
public void start(final boolean startFactory) throws MQClientException {
switch (this.serviceState) {
case CREATE_JUST:
this.serviceState = ServiceState.START_FAILED;
//省略检查配置参数、异常处理的代码
......
// 获取MQClientInstance的实例mQClientFactory,没有则自动创建新的实例
this.mQClientFactory = MQClientManager.getInstance().getOrCreateMQClientInstance(this.defaultMQProducer, rpcHook);
// 在mQClientFactory中注册自己
boolean registerOK = mQClientFactory.registerProducer(this.defaultMQProducer.getProducerGroup(), this);
//省略异常处理
......
//启动mQClientFactory
if (startFactory) {
mQClientFactory.start();
}
//更新状态
this.serviceState = ServiceState.RUNNING;
break;
case RUNNING:
case START_FAILED:
case SHUTDOWN_ALREADY:
//省略异常处理
....