问题小记(二):Spring @Scheduled 浅尝辄止篇
之前一直停留在@EnableScheduling @Scheduled篇,项目工程里只需要配置这两个就能够开发业务了,一直不知道里面是怎么做到的? 带着上次看问题的功夫,简单了解了下内幕。
项目使用springboot版本2.3.x;
@EnableScheduling是干嘛的?
springboot开发体系下约定大于配置,很多事情都别人都已经为我们考虑好了,他们都已经想到了。先说结论:
@EnableScheduling引入了SchedulingConfiguration这个配置类,继而引入了ScheduledAnnotationBeanPostProcessor这个后置bean处理器(生命周期里加工bean的),通过扫描所有的@Scheduled注解的方法,进而生成一个一个的task去定时做任务。

@Scheduled 是干嘛的?
通过上面的描述,@EnableScheduling是全局开关,@Scheduled就是具体的开启装置,编写crontab表达式,执行的是JAVA方法。
ScheduledAnnotationBeanPostProcessor后置加工的逻辑
代码意思就是:后置处理所有的bean时,针对所有的@Scheduled的方法,生成对应CronTask、FixedDelayTask、FixedRateTask几种任务,在ScheduledTaskRegistrar缓存这些Task,初始化完毕后通过ScheduledExecutorService.schedule逐个启动任务线程。

不改代码发布的情况下停止任务
有时候会遇到一个任务不想要继续执行了,但是更改代码重新发布周期比较长,可以采用下面方案。
当前系统是运行在k8s集群中,@Scheduled中cron是通过configMap配置的。如果没有使用k8s,jar包跑在服务器上也是可以的。通过更改 task.time为 - 后重启服务即可停止任务执行。
@Scheduled(cron = "${task.time}")
public void interval2Min(){
System.out.println(new Date());
}

浙公网安备 33010602011771号