pullRequest, offset, brokerBusy);
if (brokerBusy) {
log.info("[NOTIFYME]the first time to pull message, but pull request offset larger than broker consume offset. pullRequest: {} NewOffset:
{}", pullRequest, offset);
}
pullRequest.setLockedFirst(true);
pullRequest.setNextOffset(offset);
}
} else {
this.executePullRequestLater(pullRequest, PULL_TIME_DELAY_MILLS_WHEN_EXCEPTION);
log.info(“pull message later because not locked in broker, {}”, pullRequest);
return;
}
}
根据 PullRequest 拉取消息。如果处理队列未被锁定,则延迟拉取消息,也就说消息消费需要在ProceeQueue 队列被自己锁定的情况下才会拉取消息,否则将 PullRequest 延迟3s再拉取。并且PullRequest 的初始拉取点在拉取时只在第一次拉取时设置。
实现类:org.apache.rocketmq.client.impl.consumer.ConsumeMessageOrderlyService
3.1核心属性与构造函数
- private final static long MAX_TIME_CONSUME_CONTINUOUSLY =
Long.parseLong(System.getProperty(“rocketmq.client.maxTimeConsumeContinuously”, “60000”));
MAX_TIME_CONSUME_CONTINUOUSLY :消费任务一次运行的最大时间。可以通过-Drocketmq.client.maxTimeConsumeContinuously来设置,默认为60s。
-
DefaultMQPushConsumerImpl defaultMQPushConsumerImpl:消息消费者实现类。
-
DefaultMQPushConsumer defaultMQPushConsumer:消息消费者。
-
MessageListenerOrderly messageListener:顺序消息消费监听器。
-
BlockingQueue< Runnable> consumeRequestQueue:消息消费任务。
-
ThreadPoolExecutor consumeExecutor:消息消费线程池。
-
String consumerGroup:消息消费组。
-
MessageQueueLock messageQueueLock:消息消费队列锁,其内如实现为:
构造方法如下:
public ConsumeMessageOrderlyService(DefaultMQPushConsumerImpl defaultMQPushConsumerImpl,
MessageListenerOrderly messageListener) {
this.defaultMQPushConsumerImpl = defaultMQPushConsumerImpl;
this.messageListener = messageListener;
this.defaultMQPushConsumer = this.defaultMQPushConsumerImpl.getDefaultMQPushConsumer();
this.consumerGroup = this.defaultMQPushConsumer.getConsumerGroup();
this.consumeRequestQueue = new LinkedBlockingQueue(); // @1
this.consumeExecutor = new ThreadPoolExecutor(
this.defaultMQPushConsumer.get(),
this.defaultMQPushConsumer.getConsumeThreadMax(),
1000 * 60,
TimeUnit.MILLISECONDS,
this.consumeRequestQueue,ConsumeThreadMin
new ThreadFactoryImpl(“ConsumeMessageThread_”)); // @2
this.scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(new ThreadFactoryImpl(“ConsumeMessageScheduledThread_”));
//@3
}
代码@1:创建任务拉取队列,注意,这里使用的是无界队列。
代码@2:创建消费者消费线程池,注意由于消息任务队列 consumeRequestQueue 使用的是无界队列,故线程池中最大线程数量取自 consumeThreadMin。
代码@3:创建调度线程,该线程主要调度定时任务,延迟延迟消费等。