我正在尝试通过手动确认从一个主题中消耗多条消息,但是如果所有消息仅一次通过确认,则确认工作有效。
@KafkaListener(
id = "${kafka.buyers.product-sales-pricing.id}",
topics = "${kafka.buyers.product-sales-pricing.topic}",
groupId = "${kafka.buyers.group-id}",
concurrency = "${kafka.buyers.concurrency}"
)
public void listen( List<String> message, Acknowledgment ack ){}
在上面的代码中,如果我在spring boot属性文件中输入以下配置,则每次消耗5条消息:
kafka:
max-poll-records: 5 # Maximum number of records returned in a single call to poll()
但是如果我确认收听,那么它将同时确认所有5条消息。
实际上,我想为每个消息分别确认(表示5条消息中有5条确认)。
如何在Spring Boot项目中执行此操作?
答案 0 :(得分:2)
使用批处理侦听器时,在调用Acknowledgment.acknowledge()
时将确认整个批处理。
在这种情况下,我建议使用单个记录侦听器,而不是批处理侦听器。
听(字符串消息,确认消息)
目前尚不清楚为什么只对部分批次提交偏移量。
如果必须使用批处理侦听器,它仍然可以完成,但是更加复杂-您需要获取List<ConsumerRecord<?, ?>>
才能获取主题/分区/偏移量信息,还需要向其中添加Consumer<?, ?> consumer
方法参数(并删除Acknowledgment
;然后可以根据需要在使用者上调用commitOffsets()
。但是必须在侦听器线程上调用它-使用者不是线程安全的。