前面说了 消息生产者的启动主要流程,从启动脚本到
DefaultMQProducer
再到
DefaultMQProducerImpl
然后到
MQClientInstance
。都是一步一步委托的。这里之所以把
MQClientInstance
单独拿出来说,是因为
MQClientInstance
这个类不仅仅在生产者用到,他还是消费者,RocketMQ的Admin控制台的共用一个客户端实体类。类定义在client包中,这个类可以理解为一个工厂,是对消费者,生产者以及控制台三者的一个合集,内部封装了netty客户端,消息的生产,消费和负载均衡的实现类等。
MQClientInstance
的内部变量
字段名 | 对象类型 | 作用 |
---|---|---|
clientConfig |
ClientConfig |
客户端一些通用配置,topic拉取周期时间,心跳周期时间等 |
producerTable |
ConcurrentMap<String MQProducerInner> |
注册了的生产者的实例缓存集合,MQProducerInner的实现类就是DefaultMQProducerImpl |
consumerTable |
ConcurrentMap<String , MQConsumerInner> |
注册了的消费则实例缓存集合,MQConsumerInner的实现类就是对应的pull和push两种方式拉取消息的类 |
adminExtTable |
ConcurrentMap<String, MQAdminExtInner> |
注册了的admin实例缓存集合 |
nettyClientConfig |
NettyClientConfig |
netty客户端的配置类 |
mQClientAPIImpl |
MQClientAPIImpl |
MQ内部一些操作的api的实现,包括发送,消费消息和admin控制台的一些操作指令的实现,以及一些网络请求的处理 |
mQAdminImpl |
MQAdminImpl |
MQ的admin控制台操作的内部逻辑的实现类,控制台可以通过一些命令来对消息或者topic进行操作 |
topicRouteTable |
ConcurrentMap<String, TopicRouteData> |
topic的路由配置信息 |
pullMessageService |
PullMessageService |
push模式下,拉取消息的线程 |
rebalanceService |
RebalanceService |
消息消费的负载均衡类 |
defaultMQProducer |
DefaultMQProducer |
消息生产者类 |
MQClientInstance的创建
前面讲Producer的启动逻辑说到了MQClientInstance
的创建,这里接着继续。整个类的创建过程就是内部的一些成员变量的创建和初始化的过程
public MQClientInstance(ClientConfig clientConfig, int instanceIndex, String clientId, RPCHook rpcHook) {
this.clientConfig = clientConfig;
//实例id ip+"@"+instanceName
this.instanceIndex = instanceIndex;
//客户端netty配置
this.nettyClientConfig = new NettyClientConfig();
//回调的线程数
this.nettyClientConfig.setClientCallbackExecutorThreads(clientConfig.getClientCallbackExecutorThreads());
//是否用tls 也就是证书校验
this.nettyClientConfig.setUseTLS(clientConfig.isUseTLS());
//请求事件处理器
this.clientRemotingProcessor = new ClientRemotingProcessor(this);
//创建MQClientAPIImpl,同事注册一些时间处理器,和rpc调用的钩子方法
this.mQClientAPIImpl = new MQClientAPIImpl(this.nettyClientConfig, this.clientRemotingProcessor, rpcHook, clientConfig);
//更新nameServer的地址
if (this.clientConfig.getNamesrvAddr() != null) {
this.mQClientAPIImpl.updateNameServerAddressList(this.clientConfig.getNamesrvAddr());
log.info("user specified name server address: {}", this.clientConfig.getNamesrvAddr());
}
this.clientId = clientId;
//操作MQClientAPIImpl的封装类
this.mQAdminImpl = new MQAdminImpl(this);
//push模式消费的
this.pullMessageService = new PullMessageService</