簡體   English   中英

具有多個獨立主題處理的@KafkaListener

[英]@KafkaListener with multiples independent topics processing

使用的軟件:

  • Java版本: 8
  • SpringBoot 版本: 2.4.0
  • SpringKafka 版本: 2.7.2

我在春天有這個方法:

    @KafkaListener(topics="#{consumerSpring.topics}", groupId="#{consumerSpring.consumerId}", concurrency="#{consumerSpring.recommendedConcurrency}")
    public void listenKafkbooiaTopic(@Header(KafkaHeaders.RECEIVED_TOPIC) String topicName, @Payload String message, Acknowledgment ack) throws Exception {
        ConsumerSpring consumer = this.consumerSpring();
        //
        //
        KafkaHandlerReturn handlerReturn = consumer.getKafkaProxy().handleRequest(
                topicName,
                consumer.getConsumerId(),
                message);
        
        if (handlerReturn.equals(KafkaHandlerReturn.SUCCESS) || handlerReturn.equals(KafkaHandlerReturn.FAIL_LOGIC)) {
            ack.acknowledge();
        } else {
            ack.nack(5 * 1000);
        }
    }

#{consumerSpring.topics}返回

{"topic1", "topic2", "topic3"}

#{consumerSpring.consumerId}返回:

myConsumer

#{consumerSpring.recommendedConcurrency}返回:

3

好的! 這工作正常! 但我需要隔離這些主題,例如:

TopicA 陷入致命錯誤,它正在調用:

ack.nack(5 * 1000);

但是主題:TopicB 和 TopicC 並沒有被卡住。 然后我需要這些主題繼續正常執行。

基本上我需要與聲明兩個獨立結構相同的行為,例如:

    @KafkaListener(topics="topica", groupId="#{consumerSpring.consumerId}")
    public void listenerTopicB(@Header(KafkaHeaders.RECEIVED_TOPIC) String topicName, @Payload String message, Acknowledgment ack) throws Exception {
        ConsumerSpring consumer = this.consumerSpring();
        //
        //
        KafkaHandlerReturn handlerReturn = consumer.getKafkaProxy().handleRequest(
                topicName,
                consumer.getConsumerId(),
                message);
        
        if (handlerReturn.equals(KafkaHandlerReturn.SUCCESS) || handlerReturn.equals(KafkaHandlerReturn.FAIL_LOGIC)) {
            ack.acknowledge();
        } else {
            ack.nack(5 * 1000);
        }
    }
    
    @KafkaListener(topics="topicb", groupId="#{consumerSpring.consumerId}")
    public void listenerTopicA(@Header(KafkaHeaders.RECEIVED_TOPIC) String topicName, @Payload String message, Acknowledgment ack) throws Exception {
        ConsumerSpring consumer = this.consumerSpring();
        //
        //
        KafkaHandlerReturn handlerReturn = consumer.getKafkaProxy().handleRequest(
                topicName,
                consumer.getConsumerId(),
                message);
        
        if (handlerReturn.equals(KafkaHandlerReturn.SUCCESS) || handlerReturn.equals(KafkaHandlerReturn.FAIL_LOGIC)) {
            ack.acknowledge();
        } else {
            ack.nack(5 * 1000);
        }
    }

不需要多種方法。

您可以將多個@KafkaListener注釋放在一個方法上,每個注釋都將創建一個單獨的容器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM