使用DeadLetterPublishingRecoverer和手动ack模式的Spring Kafka侦听器

时间:2018-12-14 14:09:49

标签: java spring spring-kafka

我很难理解如何解决这个问题,所以我在这里提出这个问题,希望其他人也已经遇到了同样的问题。 我们正在使用手动ack模式和重试限制为3的死信恢复程序运行@KafkaListener。 由于业务逻辑,在某些情况下(外部依赖项),我们不确认消息并暂停消耗5分钟,因此需要手动确认模式。

我们还需要死信队列来处理由于某种原因而无法处理的消息。

现在,在手动确认模式下的问题是,我们的侦听器/消费者在达到重试限制并将其移至dl队列时,无法确认该消息。

如果消费者服务将重新启动,他将尝试再次使用这些消息,并将它们再次移至dl队列。

有什么想法可以解决这个问题吗?

感谢汉堡的问候!

2 个答案:

答案 0 :(得分:2)

如果可能的话,我会尽量避免使用手动工具;也许可以通过增加max.poll.interval.ms来实现。

如果使用AckMode.MANUAL_IMMEDIATE,则可以在错误处理程序中直接在Consumer上执行提交。

子类化SeekToCurrentErrorHandler并覆盖handle(),如果super.handle()没有引发异常,则意味着重试已超出,您可以在Consumer上提交偏移量

答案 1 :(得分:0)

可以在提供给ContainerListenerFactory的SeekToCurrentErrorHandler实例上将

commitRecovered设置为true。

请参阅文档here

  

public void setCommitRecovered(boolean commitRecovered)

     

设置为true以提交已恢复记录的偏移量。必须使用ContainerProperties.AckMode.MANUAL_IMMEDIATE配置容器。 > commit是同步还是异步取决于容器的syncCommits属性。