阅读须知
- 文章中使用/* */注释的方法会做深入分析
正文
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 的停止流程大同小异,不再做单独分析。