问题小记(二):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());
}