问题小记(二):Spring @Scheduled 浅尝辄止篇

之前一直停留在@EnableScheduling @Scheduled篇,项目工程里只需要配置这两个就能够开发业务了,一直不知道里面是怎么做到的? 带着上次看问题的功夫,简单了解了下内幕。

项目使用springboot版本2.3.x;

@EnableScheduling是干嘛的?

springboot开发体系下约定大于配置,很多事情都别人都已经为我们考虑好了,他们都已经想到了。先说结论:
@EnableScheduling引入了SchedulingConfiguration这个配置类,继而引入了ScheduledAnnotationBeanPostProcessor这个后置bean处理器(生命周期里加工bean的),通过扫描所有的@Scheduled注解的方法,进而生成一个一个的task去定时做任务。

image


@Scheduled 是干嘛的?

通过上面的描述,@EnableScheduling是全局开关,@Scheduled就是具体的开启装置,编写crontab表达式,执行的是JAVA方法。


ScheduledAnnotationBeanPostProcessor后置加工的逻辑

代码意思就是:后置处理所有的bean时,针对所有的@Scheduled的方法,生成对应CronTask、FixedDelayTask、FixedRateTask几种任务,在ScheduledTaskRegistrar缓存这些Task,初始化完毕后通过ScheduledExecutorService.schedule逐个启动任务线程。

image


不改代码发布的情况下停止任务

有时候会遇到一个任务不想要继续执行了,但是更改代码重新发布周期比较长,可以采用下面方案。

当前系统是运行在k8s集群中,@Scheduled中cron是通过configMap配置的。如果没有使用k8s,jar包跑在服务器上也是可以的。通过更改 task.time- 后重启服务即可停止任务执行。

   @Scheduled(cron =  "${task.time}")
    public void interval2Min(){
        System.out.println(new Date());
    }
posted @ 2021-10-25 21:25  吕彬彬  阅读(80)  评论(0编辑  收藏  举报