繁体   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