Consumer源码解析:
DefaultMQPushConsumer.start():
1:设置消费者组
2:启动消费者this.defaultMQPushConsumerImpl.start();
DefaultMQPushConsumerImpl.strat()(同步方法):
1:判断服务状态 只有 服务状态为 CREATE_JUST 时,才启动 Consumer
2:防止启动多个 Consumer,先把 服务状态修改为 START_FAILED
3:检验配置信息
1:group不能为空,不能等于DEFAULT_CONSUMER
2:消息模式不能为空
3:消费位置不能为空
4:consumeTimestamp消费时间是否合法
5:allocateMessageQueueStrategy分配消息队列策略不能为空
6:订阅不能为空
7:消息监听不能为空
8:消息监听必须是顺序监听(顺序消费)和并发(并发消费)监听中的一种
9:消费的最小线程数必须在[1,1000] 默认20
10:消费的最大线程数必须在[1,1000] 默认64
11:单队列并行消费的最大跨度必须在[1, 65535]
12:pullThresholdForQueue拉消息本地缓存的最大消息数[1, 65535] 默认1000 用于流量控制,队列级别
13:pullThresholdForTopic拉消息本地缓存的最大消息数[1, 6553500] 默认1000 用于流量控制,topic级别 默认-1不限制
14:本地缓存大小限制[1, 1024M] 队列级别 默认100M
15:本地缓存大小限制[1, 102400] topic级别 默认-1不限制
16:pullInterval拉去时间间隔[0, 65535] 由于是长轮询默认为0ms
17:consumeMessageBatchMaxSize 批量消费最大消息条数,取值范围: [1, 1024]。默认是1
18:pullBatchSize 消费者去broker拉取消息时,一次拉取多少条。取值范围: [1, 1024]。默认是32 。可选配置
4.拷贝订阅信息 存放rebalanceImpl实例对象中,如果为集群消费会将重试的topic一起放入到rebalanceImpl实例对象中
5.如果为集群消费 该表实例名称
6:获取mQClientFactory
7:设置负载均衡相关信息(消费者组,消费模式,分配消息队列策略,mQClientFactory)
8:pullAPIWrapper 创建拉去API构造器
9:注册消息过滤钩子
10:获取偏移量数据(广播消费从本地获取,集群消费从远程获取)
11:加载偏移量信息
12:创建消费服务即为消费创建消费线程池(定时线程池)
13:启动消费
14:注册消费者(同步方法)写入到消费者表map中this.consumerTable.putIfAbsent(group, consumer);
注册成功:修改服务状态为CREATE_JUST,启动消费关闭后处理(优雅关闭)
15:mQClientFactory.start() 启动客户端
16:修改服务状态为running
17:更新topic订阅信息当订阅发生变化时(向nameserver更新topic路由信息 加锁)
18:broker检查客户端
19:向所有broker发送心跳(加锁)
20:进行负载均衡(新增加一个消费者,需要进行负载均衡)(唤醒rebalance线程进行负载均衡使用countlatch默认为1个线程)
3:是否开启消息追踪以及相关处理
rocketmq消费者java代码 rocketmq消费者线程数设置
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
chan实现生产者消费者模型
一个简单的例子让你更好的理解golang chan的使用
斐波拉契数列 斐波那契数列 Group