用例:给定 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)。一个观察结果是容器停止方法正在执行,但消费者没有关闭。输出没有错误
答案 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
时,我们真的会在下一个周期停止。