KafkaMessageListenerContainer.stop() 不会停止消息侦听器中消息的消耗

时间:2021-01-11 10:15:41

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

用例:给定 kafka 主题中有 100 条消息的主题,我想从偏移量 10 到偏移量 20 读取消息。我可以从起始偏移量获取。当我到达结束偏移量时,我已经编写了停止容器的代码。即使在执行代码后,消费者也可以消费更多消息(从偏移量 21 开始)。它只会在读取主题中的所有消息后停止< /p>

@Service
public class Consumer1  implements MessageListener<String, GenericRecord> {

 @Override
  public void onMessage(ConsumerRecord<String, GenericRecord> data) {
    log.info("feed record {}", data);
    if (data.offset() == 20) {
      feedService.stopConsumer();
    }
  }
}

@Service
public class FeedService{

    // start logic here

   public void stopConsumer() {
    kafkaMessageListenerContainer.stop();
  }

}

注意:我使用的是 spring-kafka 最新版本(2.6.4)。一个观察结果是容器停止方法正在执行,但消费者没有关闭。输出没有错误

1 个答案:

答案 0 :(得分:0)

stop() 不会终止当前记录批处理周期:

while (isRunning()) {
            try {
                pollAndInvoke();
            }
            catch (@SuppressWarnings(UNUSED) WakeupException e) {
                // Ignore, we're stopping or applying immediate foreign acks
            }

pollAndInvoke() 调用 KafkaConsumer.poll(),获取一些记录集合并在每条记录上调用您的 onMessage()。在某些时候你决定叫停,但这并不意味着我们真的在记录列表的末尾立即退出。

isRunning() 已经为我们返回 false 时,我们真的会在下一个周期停止。