我正在使用KafkaMessageListenerContainer来消费kafka主题,我有一个应用程序逻辑来处理依赖于其他微服务的每条记录。我现在在处理每个记录后手动提交偏移量。
但是,如果我的应用程序逻辑失败,我需要寻找失败的偏移并继续处理它直到它成功。为此我需要做一个运行时手动搜索最后一个偏移量。
这可以用KafkaMessageListenerContainer吗?
答案 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)