当Kafka侦听器方法发生异常时,请勿提交偏移量

时间:2019-10-10 01:15:23

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

我有一个kafka使用者应用程序,其中在监听器方法中使用@Kafkalistener注释进行了注释。我已经提供了主题名称和容器作为此注释的输入。此方法的参数类型为Message以及Acknowledgement。该方法侦听所有kafka消息,并且一旦接收到该消息,就对其进行处理并将其存储在DB中。之后,我使用Confirmation.acknowledge()方法手动提交偏移量。现在,如果在此行之前发生任何异常,则不会手动提交偏移量。但是,我已经看到容器属性ackOnError默认情况下设置为true。我希望获得相同的消息并对其进行处理,直到成功为止,并且不希望将指针向前移动,如果移动指针,则可能导致消息丢失。为此,我打算采取以下方法。

1)侦听器类将实现ConsumerSeekAware接口。 ConsumerSeekCallback将由ThreadLocal实例引用,并且使用此方法,将为无法处理的同一消息调用seek方法。

2)将最大投票记录设置为1。

请帮助我确定这是否是正确的方法。我没有使用Spring kafka 2.x,而是使用1.2.x。另外,目前,我已经将auto.commit.offset属性设置为false,并且将ackMode设置为manual。

1 个答案:

答案 0 :(得分:0)

1.2.x不再受支持;您应该至少升级到1.3.10;多亏了KIP-62,它的线程模型简单得多。

当前版本为2.3.0。

2.0.1正是出于这个目的引入了SeekToCurrentErrorHandler