问题描述:定时任务获取配置中心数据,进行循环执行业务逻辑,配置中心重新发布后,导致定时任务中断问题。
查阅相关资料发现原因:
- 首先Scheduled执行原理,是利用后置处理器ScheduledAnnotationBeanPostProcessor,获取带有@Scheduled注解的方法,进行执行的。
- 类上有一个@RefreshScope注解,这个注解下面是@Scope(“refresh”)注解,跟踪源码得知注册bean的时候解析@Scope注解有三个判断逻辑,singleton,prototype,其他(refresh),refresh走的是其他,它把当前对象放进了一个缓存里,Nacos发布配置文件的时候会清空这个缓存,导致当前对象不存在,导致定时任务中断。
总结:当前缓存中对象被删除,导致ScheduledAnnotationBeanPostProcessor后置处理器读取不到类上的@Scheduled注解的方法,导致无法执行。
解决思路:既然发布的时候,清空缓存导致对象不存在,就在清空后生成一个新的对象!
发布完后,会执行RefreshScopeRefreshedEvent事件,当前对象不存在,创建一个新的对象