Kafka监听器,获取所有消息

时间:2018-07-30 07:30:42

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

同事们,早上好。 我有使用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();
}

它不起作用,在调试模式下,我的断点在此站点上永远不起作用。

1 个答案:

答案 0 :(得分:2)

根据设计,侦听器容器是消息驱动的。

对于按需获取消息,最好直接使用Kafka Consumer API并使用poll()方法获取消息。