目录
MQClientInstance
介绍
为什么把MQClientInstance
单独拿出来说呢?是因为无论是生产者还是消息者底层都会与broker
进行打交道,从源码层面上,这部分的功能被抽象成一个单独的类,负责和broker打交道。
类定义在client
包中,可以理解为是一个工厂,是对生产者、消费者以及控制台三者的合集,内部封装了netty客户端,消息的生产,消费和负载均衡的实现类等。另外MQClientInstance
的实例化并不是直接new后使用,而是通过MQClientManager
这个单例类,使用饿汉模式
设计保证线程安全。
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 |
消息生产者类 |
Producer创建入口`producer.start()
Consumer的创建入口是consumer#start
,原理是一样的,这里就不多余介绍了。
public void start(final boolean startFactory) throws MQClientException {
switch (this.serviceState) {
case CREATE_JUST:
this.serviceState = ServiceState.START_FAILED;
//创建客户端
this.mQClientFactory = MQClientManager.getInstance().getOrCreateMQClientInstance(this.defaultMQProducer, rpcHook);
//注册生产者,这个会把对应的生产者加入到producerTable中,用于startScheduledTask.sendHeartbeatToAllBrokerWithLock()任务定时发送心跳包的时候带过去
boolean registerOK = mQClientFactory.registerProducer(this.defaultMQProducer.getProducerGroup(), this);