閱讀須知
- 文章中使用/* */註釋的方法會做深入分析
正文
Consumer 的停止流程和 Producer 的停止流程有很多複用的部分,前面我們已經分析過 Producer 的停止流程,複用部分這裏不再重複。Consumer 的停止同樣可以依託於 Spring bean 的生命週期,在 Spring bean 銷燬時調用 DefaultMQPushConsumer 的 shutdown 方法:
public void shutdown() {
/* 停止 */
this.defaultMQPushConsumerImpl.shutdown();
if (null != traceDispatcher) {
traceDispatcher.shutdown();
}
}
DefaultMQPushConsumerImpl:
public synchronized void shutdown() {
switch (this.serviceState) {
case CREATE_JUST:
break;
case RUNNING:
this.consumeMessageService.shutdown();
this.persistConsumerOffset();
// 從 Broker 註銷 Consumer,與 Producer 註銷複用同樣的流程
this.mQClientFactory.unregisterConsumer(this.defaultMQPushConsumer.getConsumerGroup());
// MQ客戶端停止,與 Producer 複用同樣的流程
this.mQClientFactory.shutdown();
log.info("the consumer [{}] shutdown OK", this.defaultMQPushConsumer.getConsumerGroup());
// 銷燬重新平衡服務
this.rebalanceImpl.destroy();
// 狀態置爲已停止
this.serviceState = ServiceState.SHUTDOWN_ALREADY;
break;
case SHUTDOWN_ALREADY:
break;
default:
break;
}
}
我們是以 push 模式的 Consumer 來分析停止流程,pull 模式 Consumer 的停止流程大同小異,不再做單獨分析。