我们正在尝试在指定的窗口时间从Kafka读取数据(因此我们有Kafka使用者),这意味着避免在其他时间读取数据。但是,我们不确定在该时间段到期后如何关闭使用者。我想知道是否有任何这样做的例子吗?在此先感谢您对我们的帮助。
答案 0 :(得分:3)
您可以禁用autoStartup
,然后使用KafkaListenerEndpointRegistry containers
和start
方法手动启动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();
}
}