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

时间:2019-02-12 09:13:53

标签: spring-boot apache-kafka kafka-consumer-api spring-kafka

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

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

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

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

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

@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();
    }

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

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

1 个答案:

答案 0 :(得分:1)

请参见this answer

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

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

对于您而言,恢复程序可以调用REST服务并在失败时引发异常。