我很难理解如何解决这个问题,所以我在这里提出这个问题,希望其他人也已经遇到了同样的问题。 我们正在使用手动ack模式和重试限制为3的死信恢复程序运行@KafkaListener。 由于业务逻辑,在某些情况下(外部依赖项),我们不确认消息并暂停消耗5分钟,因此需要手动确认模式。
我们还需要死信队列来处理由于某种原因而无法处理的消息。
现在,在手动确认模式下的问题是,我们的侦听器/消费者在达到重试限制并将其移至dl队列时,无法确认该消息。
如果消费者服务将重新启动,他将尝试再次使用这些消息,并将它们再次移至dl队列。
有什么想法可以解决这个问题吗?
感谢汉堡的问候!
答案 0 :(得分:2)
如果可能的话,我会尽量避免使用手动工具;也许可以通过增加max.poll.interval.ms
来实现。
如果使用AckMode.MANUAL_IMMEDIATE
,则可以在错误处理程序中直接在Consumer
上执行提交。
子类化SeekToCurrentErrorHandler
并覆盖handle()
,如果super.handle()
没有引发异常,则意味着重试已超出,您可以在Consumer
上提交偏移量
答案 1 :(得分:0)
commitRecovered设置为true。
请参阅文档here
public void setCommitRecovered(boolean commitRecovered)
设置为true以提交已恢复记录的偏移量。必须使用ContainerProperties.AckMode.MANUAL_IMMEDIATE配置容器。 > commit是同步还是异步取决于容器的syncCommits属性。