• 解决Nacos配置刷新导致定时器停止执行的问题


    1. 问题描述

    我使用了一个定时器类来执行某个任务,并且使用Nacos作为配置中心来管理定时器的配置。我发现当Nacos配置发生变化时,定时器实例会停止执行任务,导致任务无法按预期执行。

    2. 原先的实现方式

    以下是我原先的代码实现方式:

    @Component
    @RefreshScope
    @RequiredArgsConstructor
    public class LikedTimesCheckTask {
    
        @Value("${tj.liked.times.check.biz-type}")
        private List<String> bizType;
    
        @Value("${tj.liked.times.check.max-biz-size}")
        private int maxBizSize;
    
        private final ILikedRecordService recordService;
    
        @Scheduled(fixedDelay = 2000)
        public void checkLikedTimes(){
            System.out.println(bizType);
            System.out.println(maxBizSize);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    3. 解决方案

    解决这个问题,采取了以下方案:

    1. 创建一个独立的配置类:我创建了一个名为LikedCheckConfig的独立配置类,用于管理定时器相关的配置属性。
    @Getter
    @Setter
    @RefreshScope
    @Configuration
    public class LikedCheckConfig {
        @Value("${tj.liked.times.check.biz-type}")
        private List<String> bizType;
    
        @Value("${tj.liked.times.check.max-biz-size}")
        private int maxBizSize;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    1. 在定时器类中使用配置类:

      将配置类注入到定时器类中,并通过构造函数注入。

    @Component
    @RequiredArgsConstructor
    public class LikedTimesCheckTask {
    
        private final LikedCheckConfig likedCheckConfig;
    
        @Scheduled(fixedDelay = 2000)
        public void checkLikedTimes(){
            System.out.println(likedCheckConfig.getBizType());
            System.out.println(likedCheckConfig.getMaxBizSize());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    4. 总结

    在使用Nacos作为配置中心并且同时使用Spring的定时器时,配置刷新可能会导致定时器停止执行任务的问题。为了解决这个问题,我采取了以下步骤:

    1. 创建一个独立的配置类:我创建了一个名为LikedCheckConfig的独立配置类,用于管理定时器相关的配置属性。该配置类使用了@RefreshScope注解,表示在配置刷新时会更新配置属性的值。

    2. 在定时器类中使用配置类:我们将配置类注入到定时器类中,并通过构造函数注入。这样,定时器类就可以使用配置类中的属性来执行任务。

    通过以上步骤,我们成功解决了Nacos配置刷新导致定时器停止执行的问题。现在,当配置发生变化时,定时器仍然可以按时执行任务,并且可以获取到最新的配置值。

    这种解决方案的关键在于使用独立的配置类,并将配置类注入到定时器类中。这样做的好处是,配置类的属性值会在配置刷新时自动更新,而定时器类不会受到配置刷新的影响,可以继续正常执行任务。

  • 相关阅读:
    spark集群部署(第三弹)
    基于图像识别的小车智能寻迹控制系统
    JVM线程安全
    高通WLAN框架学习(34)-- QCMobileAP IOCTLs(iwpriv)命令大全
    axios的安装使用
    WPS回应套娃式收费:AI功能投入比较大且福利期已到;Sam Altman辟谣下周发GPT-5和搜索引擎 | 极客头条
    uni-app:实现简易自定义下拉列表
    YOLOv8-Seg改进:位置信息的轴线压缩增强注意力Sea_Attention| ICLR2023 SeaFormer,轻量级语义分割算法,复旦大学和腾讯
    Kafka的基本结构以及幂等性和事务
    IDEA、DataGrip、Navicat连接openGauss数据库
  • 原文地址:https://blog.csdn.net/Bilal_0/article/details/133156994