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 的停止流程大同小異,不再做單獨分析。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章