如何从Spring ListenerContainerIdleEvent执行手动偏移确认

时间:2019-07-10 08:44:54

标签: java spring-kafka

我有一个Kafka监听器,该监听器使用以下属性实现确认消息监听器接口:

  1. ackMode-MANUAL_IMMEDIATE
  2. idleEventInterval-3分钟

在侦听器上使用消息时,它决定是否通过acknowledgment.acknowledge()确认特定记录,并按预期工作。

此外,我有一个方案要在X分钟后确认最后一个偏移号(将其保留在内存中)(即使没有消息到达)。 为了克服此要求,我决定使用ListenerContainerIdleEvent,该事件根据我的配置每3分钟触发一次。

我的问题是:

  1. 是否有任何方法可以将Kafka偏移量确认为空闲事件的触发? idle事件包含对KafkaMessageListenerContainer的引用,但它封装了保存KafkaConsumer的ListenerConsumer。

  2. 空闲消息事件是否发送同步(具有与KafkaListenerConsumer相同的线程)?从代码中,默认实现是SimpleApplicationEventMulticaster,该实现无需TaskExecutor即可初始化,因此它将在同一线程上调用侦听器。您可以批准吗?

我正在使用spring-kafka 1.3.9。

1 个答案:

答案 0 :(得分:0)

  1. 是的,只需保留对最后一个Acknowledgment的引用,然后再次调用acknowledge()

  2. 是的,默认情况下,该事件已发布在使用者线程上。

即使事件在另一个线程(多播程序中的执行器)上发布,它也仍然可以正常工作,因为,从轮询中唤醒后,消费者将把提交排队并进行处理,而不是直接提交。

请参见processAck()中的逻辑。

在较新的版本(从2.0开始)中,事件引用了使用者,因此只要事件在使用者线程上发布,您就可以直接与其进行交互(获取当前位置并再次提交)。