前言
在前面consumer启动的博客中,有说过,在启动过程中,有两个比较重要的逻辑,分别是负载均衡和拉取消息的service,这篇博客,主要记录拉取消息的service,因为前面的demo和这篇笔记中的demo,都是基于push模式来学习的,所以前面的笔记都是基于push模式的,但是最近看了下pull模式,和push模式的代码还是有点区别的,所以后面单独起一篇博客,记录pull模式的逻辑
源码
org.apache.rocketmq.client.impl.consumer.PullMessageService#run
前面有说过,拉取消息,使用的是这个service,所以我们从这个service的入口处开始看起
这里会发现,只有两行代码
- 从一个queue中拉取到一个pullRequest请求体
- 然后调用pullMessage方法
这里的这个queue很重要,这个queue中存放的是拉取消息的请求,会再调用pullMessage()方法拉取到消息,各个消费者处理完之后,再放到pullRequestQueue中一个请求,所以这里就会在本次拉取消息的请求完成之后,接着取pullRequest,再次触发拉取消息的请求
这里有一个很重要的逻辑:既然拉取消息的请求,是从pullRequestQueue中开始的,那在consumer启动之后,第一次拉取消息的pullRequest是什么放进队列里面的呢?因为这里看到只是去取数据,总要有一个地方,先放进去一个请求,才会开始拉取消息;第一次把pullRequest放到queue中,是在负载均衡分配了messageQueue之后,会构建pullRequest,然后把请求放到queue中,在后面负载均衡的service笔记中会记录
我们接着来看pullMessage()的相关逻辑:
会发现,在这个方法中&