Spring kafka消费者,在运行时寻求偏移?

时间:2017-03-24 10:20:23

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

我正在使用KafkaMessageListenerContainer来消费kafka主题,我有一个应用程序逻辑来处理依赖于其他微服务的每条记录。我现在在处理每个记录后手动提交偏移量。

但是,如果我的应用程序逻辑失败,我需要寻找失败的偏移并继续处理它直到它成功。为此我需要做一个运行时手动搜索最后一个偏移量。

这可以用KafkaMessageListenerContainer吗?

2 个答案:

答案 0 :(得分:4)

请参阅Seeking to a Specific Offset

  

为了寻求,您的听众必须实施ConsumerSeekAware,其中包含以下方法:

     

void registerSeekCallback(ConsumerSeekCallback callback);

     

void onPartitionsAssigned(Map<TopicPartition, Long> assignments, ConsumerSeekCallback callback);

     

void onIdleContainer(Map<TopicPartition, Long> assignments, ConsumerSeekCallback callback);

     

第一个是在容器启动时调用的;在初始化后的某个任意时间寻找时,应该使用此回调。您应该保存对回调的引用;如果您在多个容器(或ConcurrentMessageListenerContainer)中使用相同的侦听器,则应将回调存储在ThreadLocal或由侦听器线程键入的其他结构中。

答案 1 :(得分:0)

please refer to Spring Kafka document

“对于现有的组ID,初始偏移量是该组ID的当前偏移量。”

Confluent还提到: “如果使用者崩溃或被关闭,则其分区将被重新分配给另一个成员,该成员将从每个分区的最后提交的偏移量开始使用”。

在您的情况下,这意味着使用者恢复使用时,它将在最后提交的偏移量处继续。如果您通过以下方式手动提交

,则您也无需“寻找失败的偏移量”

ENABLE_AUTO_COMMIT_CONFIG = False

factory.getContainerProperties()。setAckMode(ContainerProperties.AckMode.MANUAL_IMMEDIATE)