同事们,早上好。 我有使用Spring Kafka的Kafka项目,它听了一个明确的话题。 我每天需要一次听所有消息,将它们放入集合中,然后在其中查找特定消息。 我不明白如何在一个@KafkaListener方法中读取所有消息。 我的课是:
@Component
public class KafkaIntervalListener {
public CountDownLatch intervalLatch = new CountDownLatch(1);
private final SCDFRunnerService scdfRunnerService;
public KafkaIntervalListener(SCDFRunnerService scdfRunnerService) {
this.scdfRunnerService = scdfRunnerService;
}
@KafkaListener(topics = "${kafka.interval-topic}", containerFactory = "intervalEventKafkaListenerContainerFactory")
public void intervalListener(IntervalEvent event) throws UnsupportedEncodingException, JSONException {
System.out.println("Recieved interval message: " + event);
IntervalType type = event.getType();
Instant instant = event.getInterval();
List<IntervalEvent> events = new ArrayList<>();
events.add(event);
events.size();
this.intervalLatch.countDown();
}
}
我的事件集合的大小始终为1; 我尝试使用不同的循环,但随后,我的收藏集被同一条信息归档了5.3亿次。
更新: 我找到了一种使用factory.setBatchListener(true);的方法。但是我需要使用@Scheduled(cron =“ $ {kafka.cron}”,zone =“ Europe / Moscow”)启动它。现在,这种方法一直在监听。现在我要尝试这样的事情:
@Scheduled(cron = "${kafka.cron}", zone = "Europe/Moscow")
public void run() throws Exception {
kafkaIntervalListener.intervalLatch.await();
}
它不起作用,在调试模式下,我的断点在此站点上永远不起作用。
答案 0 :(得分:2)
根据设计,侦听器容器是消息驱动的。
对于按需获取消息,最好直接使用Kafka Consumer
API并使用poll()
方法获取消息。