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


    一、定时启动的应用场景

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

    二、实现思路

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

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

    三、实现代码

    @Component
    @EnableScheduling
    public 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

  • 相关阅读:
    bzoj 3091 城市旅行(LCT+数学分析)
    bzoj 2843 极地旅行社(LCT)
    Tsinsen A1303. tree(伍一鸣) (LCT+处理标记)
    bzoj 2002 [Hnoi2010]Bounce 弹飞绵羊(LCT)
    bzoj 2049 [Sdoi2008]Cave 洞穴勘测(LCT)
    vijos P1213 80人环游世界(有源汇的上下界费用流)
    bzoj 3698 XWW的难题(有源汇的上下界最大流)
    bzoj 2502 清理雪道(有源汇的上下界最小流)
    sgu 176 Flow construction(有源汇的上下界最小流)
    详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别
  • 原文地址:https://www.cnblogs.com/caoweixiong/p/11181459.html
Copyright © 2020-2023  润新知