RocketMQ源码解析之Consumer停止

阅读须知

  • 文章中使用/* */注释的方法会做深入分析

正文

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 的停止流程大同小异,不再做单独分析。

你可能感兴趣的:(RocketMQ)