【发布时间】:2018-07-01 03:30:06
【问题描述】:
我有一个问题,还有更多想了解的问题,以便我能以正确的方式实施它。要求是通过在容器上调用 stop 方法来停止 ConcurrentMessageListenerContainer,OOTB 为 KafkaMessageListenerContainer 迭代(基于定义的并发)并为每个消费者线程调用 stop。
仅供参考,我使用的是 1.3.5,由于 Spring Boot 1.5.*,我无法迁移到 2.*。
配置: 假设我有 5 个分区和并发定义为 5 的主题。使用 Batchlistener,因此每次轮询的批处理记录数 =100。
问题: 当我们在容器上调用 stop 时,它会出现在内部,它为每个 KafkaMessageListenerContainer 设置 running false 并在 listenerConsumer 上调用 wakeup。
setRunning(false);
this.listenerConsumer.consumer.wakeup();
在测试我观察到的内容时,通过在单独的线程中调用容器上的停止,它会执行以下操作:
1)它会停止 listenerConsumer,这肯定会起作用。调用 stop 后不再进行轮询。 2)似乎任何 listenerConsumer 已经轮询了 100 条记录,并且在处理过程中它在停止之前完成了执行。 #2 每个设计调用容器停止仅发送唤醒以停止下一次轮询?因为我在 KafkaMessageListenerContainer.run() 中看不到以下任何处理
catch (WakeupException e) {
//Ignore, we're stopping
}
还有一件事,即使在 spring kafka 2.1 版本中,通过使用 ContainerStoppingBatchErrorHandler,它也会调用相同的容器停止,所以我想更多的是我理解如何处理这种情况..
总而言之,如果上面有更多详细信息,我想在从单独的线程调用 stop 时终止 listenerThread。我有手动偏移提交,所以重播批处理很好。
嗨,加里,
正如您建议让消费者感知侦听器一样,我的问题是特定于侦听器通过容器停止的。一旦容器调用停止,侦听器线程(无论是 BatchListner)都应该被中断执行。我知道侦听器已收到整个记录民意调查,问题不在于丢失偏移量,因为 ack 处于批处理级别。
【问题讨论】:
标签: spring-kafka