RocketMQ——客户端篇:Producer/Consumer的实例对象
来源:互联网 发布:范雎怎么读sui 知乎 编辑:程序博客网 时间:2024/05/22 03:08
调用MQClientInstance.start方法启动MQClientInstance对象;大致逻辑如下:
1、检查MQClientInstance.ServiceState的状态(初始化状态为ServiceState.CREATE_JUST);只有状态为CREATE_JUST时才启动该Producer;其他状态均不执行启动过程;
2、将MQClientInstance的ServiceState置为start_failed,以免重复启动;
3、检查是否设置了NameServer的地址(在启动Producer之前在应用层设置ClientConfig.namesrvAddr),若没有则从地址服务器找Name Server地址,地址服务器的路径是"http://" +WS_DOMAIN_NAME+":8080/rocketmq/"+WS_DOMAIN_SUBGROUP;其中WS_DOMAIN_NAME为system.property配置参数rocketmq.namesrv.domain的值,WS_DOMAIN_SUBG为system.property配置参数rocketmq.namesrv.domain.subgroup的值;
4、调用MQClientAPIImpl.start方法:首先调用MQClientAPIImpl. remotingClient方法,启动Netty客户端;然后以PROJECT_CONFIG为NameSpace,本地IP为key值向NameServer发送GET_KV_CONFIG请求,获取前缀赋值给MQClientAPIImpl.projectGroupPrefix变量;
5、设置各类定时任务:
5.1)若Name Server地址(ClientConfig.namesrvAddr)为空,则设置定时获取Name Server地址,每隔120秒从地址服务器查找Name Server地址;
5.2)每隔30秒调用一次MQClientInstance.updateTopicRouteInfoFromNameServer()方法更新topic的路由信息;
5.3)每隔30秒进行一次清理离线的Broker的工作。遍历MQClientInstance.brokerAddrTable的值,对于不在MQClientInstance.topicRouteTable中的Broker地址,从brokerAddrTable中清理掉;
5.4)每隔30秒调用一次MQClientInstance.sendHeartbeatToAllBrokerWithLock()方法,在该方法中,第一,向所有在MQClientInstance.brokerAddrTable列表中的Broker发送心跳消息;第二,向Filter过滤服务器发送REGISTER_MESSAGE_FILTER_CLASS请求码,更新过滤服务器中的Filterclass文件;
5.5)每隔5秒调用一次MQClientInstance.persistAllConsumerOffset()方法。将每个Consumer端的消费进度信息向Broker同步(详细步骤见4.2.2小节),只有Consumer端才会进行同步;Producer端不发起同步;
5.6)定期每1毫秒执行一次MQClientInstance.adjustThreadPool()方法检测并调整PUSH模式(DefaultMQPushConsumer)下ConsumeMessageService对象中线程池的线程数)。该ConsumeMessageService类有两个子类ConsumeMessageConcurrentlyService和ConsumeMessageOrderlyService,分别表示并发消费和顺序消费两类情况,这两个之类的adjustThreadPool方法是一样的,在此,以ConsumeMessageConcurrentlyService对象为例,在初始化ConsumeMessageConcurrentlyService对象的过程中利用DefaultMQPushConsumer.consumeThreadMax和DefaultMQPushConsumer. consumeThreadMin初始化consumeExecutor线程池。在该方法中遍历MQClientInstance.consumerTable:ConcurrentHashMap<String/* group */, MQConsumerInner>变量,若MQConsumerInner为DefaultMQPushConsumerImpl,则调用DefaultMQPushConsumerImpl.adjustThreadPool()方法,在该方法中,首先汇总DefaultMQPushConsumerImpl.RebalanceImpl.processQueueTable中所有ProcessQueue对象的msgAccCnt值(即表示Broker端未消费的逻辑队列大小);由DefaultMQPushConsumer.adjustThreadPoolNumsThreshold参数设置阀值,默认为100000;
若汇总的msgAccCnt值大于adjustThreadPoolNumsThreshold值,并且ConsumeMessageConcurrentlyService.consumeExecutor的当前线程数量小于最大线程数,则将当前线程数量加1;
若汇总的msgAccCnt值小于adjustThreadPoolNumsThreshold*0.8,并且ConsumeMessageConcurrentlyService.consumeExecutor的当前线程数量大于最小线程数,则将当前线程数量减1;
6、启动PullMessageService服务线程,该服务监听PullMessageService.pullRequestQueue:LinkedBlockingQueue<PullRequest>队列,若该队列有拉取消息的请求,则选择Consumer进行消息的拉取,该定时服务是Consumer使用的;
7、启动RebalanceService服务线程,该服务是Consumer端使用的;
8、启动在初始化MQClientInstance对象过程中初始化的DefaultMQProducer对象,即调用内部初始化的DefaultMQProducer对象的DefaultMQProducerImpl.start(false)方法,参数为false表示在启动该Producer对象的内部不启动MQClientInstance;
9、设置MQClientInstance的ServiceState为RUNNING;
- RocketMQ——客户端篇:Producer/Consumer的实例对象
- 1 rocketMQ producer,consumer基本特征
- RocketMQ——Producer篇:启动过程
- RocketMQ——Consumer篇:启动过程
- RocketMQ——Producer篇:发送普通消息
- RocketMQ——Producer篇:发送定时消息
- RocketMQ——Producer篇:发送顺序消息
- RocketMQ——Producer篇:发送事务消息
- RocketMQ——Producer篇:其他功能介绍
- RocketMQ——Consumer篇:向Broker同步消费进度的定时任务
- RocketMQ——Consumer篇:PUSH模式下拉取消息服务的线程(PullMessageService)
- RocketMQ——Consumer篇:PUSH模式下的消息拉取(DefaultMQPushConsumer)
- RocketMQ——Consumer篇:PULL消费模式下的调度消费服务
- RocketMQ——Consumer篇:PULL模式下的消息消费(DefaultMQPullConsumer)
- rocketmq原理:name server ,broker, producer, consumer之间通信
- Producer-Consumer的Ruby实现
- 多线程的Producer/Consumer模式
- Kafka的 Consumer和Producer
- 关于是否为Ajax请求的判断
- 彩色网格
- Qt自定义菜单项
- JAVA调用Python及Shell
- mybatis集成spring操作数据库(以注解的方式)
- RocketMQ——客户端篇:Producer/Consumer的实例对象
- win10系统输入法图标不见了怎么找回
- Java:从字符串中提取字符的一系列方法及代码示例
- web前端网站合集(自己收集)
- Ubuntu16.04 配置虚拟主机
- MySQL学习笔记——20170808
- index的注释与理解(1)JS遮罩层如何写之Window.onload
- redis的哈希使用
- git revert