关于Spring Kafka @KafkaListener:Spring Kafka @KafkaListener-重试发送失败的消息并手动提交偏移量

Spring Kafka @KafkaListener - Retry sending failed messages and manually commit the offset

我正在使用@KafkaListener从kafka主题中进行消费,我有一个应用程序逻辑可以处理不同消费者组中多个消费者的每条记录。

现在,我的问题陈述是-我必须将使用的消息发送到第三方剩余端点。
如果消息发送到其余端点失败,则我不应该提交偏移量,而需要根据可配置的次数重试发送消息。
可配置后没有重试,如果发送消息失败。我需要记录异常原因并提交偏移量。

我正在使用Spring Kafka 2.2.0。以下是我的手动确认配置

1
2
3
4
5
6
spring.kafka.consumer.auto-offset-reset=earliest
spring.kafka.consumer.enable-auto-commit=false

spring.kafka.listener.ack-mode=manual-immediate

logging.level.org.springframework.kafka=debug

到现在为止,我已经可以使用其他消费者发布到主题中的消息。并且还能够手动确认来自其他消费者的补偿。例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@KafkaListener(topics ="testTopic",groupId="group-1")
    public void consumerOne(ConsumerRecord<String, String> record,Acknowledgment ack) {
        logger.info("OF PayLoad:{}", record);
        logger.info("OF value:"+record.value());
        logger.info("OF Offset:{}",record.offset());
        ack.acknowledge();

    }
    @KafkaListener(topics ="testTopic",groupId="group-2")
    public void consumerTwo(ConsumerRecord<String, String> record,Acknowledgment ack) {
        logger.info("MF PayLoad_2:{}", record);
        logger.info("MF value_2:"+record.value());
        logger.info("MF Offset_2:{}",record.offset());
        //ack.acknowledge();
    }

在这里,消费者两个没有确认该消息。我想根据可配置的时间重试将所有消息再次发送给使用者。

任何示例或建议都会有很大帮助。


看到这个答案。

在2.2中,我们添加了将恢复程序添加到SeekToCurrentErrorHandler的功能,该功能可以采取一些措施。

我的最终评论中的pull请求显示了如果恢复器成功恢复消息,如何提交偏移量。 这将是在星期四的2.2.4版本中。

在您的情况下,恢复器可以调用REST服务并在失败时引发异常。