Spring-Kafka —— KafkaListener定时启动和停止

Spring-Kafka —— KafkaListener定时启动和停止

一、定时启动的应用场景

比如现在单机环境下,我们需要利用Kafka做数据持久化的功能,由于用户活跃的时间为早上10点至晚上12点,那在这个时间段做一个大数据量的持久化可能会影响数据库性能导致用户体验降低,我们可以选择在用户活跃度低的时间段去做持久化的操作,也就是晚上12点后到第二条的早上10点前。

二、实现思路

  1. 禁止KafkaListener自启动(AutoStartup)
  2. 编写两个定时任务,一个晚上12点,一个早上10点
  3. 分别在12点的任务上启动KafkaListener,在10点的任务上关闭KafkaListener

这里需要注意一下启动监听容器的方法,项目启动的时候监听容器是未启动状态,而resume是恢复的意思不是启动的意思,所以我们需要判断容器是否运行,如果运行则调用resume方法,否则调用start方法

三、实现代码

@Component@EnableSchedulingpublic class TaskListener{    private static final Logger log= LoggerFactory.getLogger(TaskListener.class);    @Autowired    private KafkaListenerEndpointRegistry registry;    @Autowired    private ConsumerFactory consumerFactory;    @Bean    public ConcurrentKafkaListenerContainerFactory delayContainerFactory() {        ConcurrentKafkaListenerContainerFactory container = new ConcurrentKafkaListenerContainerFactory();        container.setConsumerFactory(consumerFactory);        //禁止自动启动        container.setAutoStartup(false);        return container;    }    @KafkaListener(id = "durable", topics = "topic.quick.durable",containerFactory = "delayContainerFactory")    public void durableListener(String data) {        //这里做数据持久化的操作        log.info("topic.quick.durable receive : " + data);    }    //定时器,每天凌晨0点开启监听    @Scheduled(cron = "0 0 0 * * ?")    public void startListener() {        log.info("开启监听");        //判断监听容器是否启动,未启动则将其启动        if (!registry.getListenerContainer("durable").isRunning()) {            registry.getListenerContainer("durable").start();        }        registry.getListenerContainer("durable").resume();    }    //定时器,每天早上10点关闭监听    @Scheduled(cron = "0 0 10 * * ?")    public void shutDownListener() {        log.info("关闭监听");        registry.getListenerContainer("durable").pause();    }}

参考

  https://www.jianshu.com/p/2447592ca5a9

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部