Spring Schedule有读取Kafka主题的示例吗?

时间:2019-12-10 04:09:56

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

我们正在尝试在指定的窗口时间从Kafka读取数据(因此我们有Kafka使用者),这意味着避免在其他时间读取数据。但是,我们不确定在该时间段到期后如何关闭使用者。我想知道是否有任何这样做的例子吗?在此先感谢您对我们的帮助。

2 个答案:

答案 0 :(得分:3)

您可以禁用autoStartup,然后使用KafkaListenerEndpointRegistry containersstart方法手动启动kafka stop @KafkaListener Lifecycle Management

public class KafkaConsumer {

 @Autowired
 private KafkaListenerEndpointRegistry registry;

  @KafkaListener(id = "myContainer", topics = "myTopic", autoStartup = "false")
  public void listen(...) { ... }

  @Schedule(cron = "")
  public void scheduledMethod() {

   registry.start();

   registry.stop()
  }

但是在上述方法中,不能保证所有来自kafka的消息都将在该时间段内使用(取决于负载和处理速度)

答案 1 :(得分:1)

我有相同的用例,但是我写了调度程序来指定一个批次的最大轮询记录,并保留一个计数器(如果计数器与最大轮询记录匹配),那么我认为该批次的处理已完成,因为它已经处理了记录一次投票中得到的结果。

然后,我取消订阅该主题,并关闭了消费者。下次调度程序运行时,它将再次处理最大轮询记录指定的限制。

fixedDelayString满足了以下目的:计划程序一旦完成指定的时间限制,便会启动。

@EnableScheduling
public class MessageScheduler{

        @Scheduled(initialDelayString = "${fixedInitialDelay.in.milliseconds}", fixedDelayString = "${fixedDelay.in.milliseconds}")
        public void run(){

            /*write your kafka consumer here with manual commit*/

            /*once your batch is finished processing unsubcribe and close the consumer*/
                kafkaConsumer.unsubscribe();
                kafkaConsumer.close();
        }

}