如何在多个主题的同一主题上使用多个kafka消息?

时间:2019-08-01 11:42:18

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

我正在尝试通过手动确认从一个主题中消耗多条消息,但是如果所有消息仅一次通过确认,则确认工作有效。

@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项目中执行此操作?

1 个答案:

答案 0 :(得分:2)

使用批处理侦听器时,在调用Acknowledgment.acknowledge()时将确认整个批处理。

在这种情况下,我建议使用单个记录侦听器,而不是批处理侦听器。

听(字符串消息,确认消息)

目前尚不清楚为什么只对部分批次提交偏移量。

如果必须使用批处理侦听器,它仍然可以完成,但是更加复杂-您需要获取List<ConsumerRecord<?, ?>>才能获取主题/分区/偏移量信息,还需要向其中添加Consumer<?, ?> consumer方法参数(并删除Acknowledgment;然后可以根据需要在使用者上调用commitOffsets()。但是必须在侦听器线程上调用它-使用者不是线程安全的。