通过配置开关 Spring Boot 中的 @Scheduled 定时任务
Spring Boot 中提供了一种非常简单的定时任务的实现方式 @Scheduled
注解,只需要加两个注解就可以轻松搞定。
1. 快速上手 @Scheduled
在 Spring Boot 中要想使用 @Scheduled
注解,先要在启动类上加上注解 @EnableScheduling
事实上在 Spring Boot 管理的类上都是可以生效的,比如 @Component
@Configuration
注解都是可以生效的,只需要配置一次即可,建议配置到启动类或者单独的配置类,方便阅读和定位问题。
注意:
任务类需要添加注解如
@Component
,将 Bean 交给 Spring 管理才可以执行定时任务如果类被
@Lazy
修饰导致 Spring Boot 在启动的时候没有实例化,那定时任务就不会开始执行。
@Scheduled 注解
fixedRate
:隔指定时间调用一次,不管任务是否执行完;fixedDelay
:任务执行完后隔指定时间再调用;cron
: 按表达式执行,可以通过工具网站来快速生成 https://cron.qqe2.com/
以上三个属性只能选择一个,详见 org.springframework.scheduling.annotation.Scheduled
类中的注释内容
Annotation that marks a method to be scheduled. Exactly one of the @link #cron}, {@link #fixedDelay}, or {@link #fixedRate} attributes must be pecified.
所以在 cron
表达式的定时任务未完成又到了执行时间,同样是不会继续执行的。具体可以参考
如果仍然需要执行可以添加@Async
注解,将方法设置为异步。
而 cron 表达式一般情况下也不会写死,通常都是将 cron 作为配置放到 yml 配置文件中,方便修改维护
动态修改配置文件,则可以使用 Apollo 实现
2. 多线程定时任务的实现
多线程任务在 Spring Boot 2.0 及其之前的版本都需要实现 SchedulingConfigurer
接口,2.1 版本后提供了自动配置类 TaskSchedulingAutoConfiguration
,实际操作可以根据 TaskSchedulingProperties
的配置项添加所需配置到 yml 文件。
2.0 以前的实现方式
2.1 以后版本只需要修改配置即可
3. 通过配置开关定时任务
通过配置开关定时任务有几种思路:
1. 定时任务内配置
这种方法基本也是在网上最容易查到的,通过注入配置文件中的 enable
值来控制是否执行定时任务中的代码逻辑。
当然这种方法很显然治标不治本,定时任务仍然在后台执行,只不过没有执行逻辑代码。
2. 👍注解 @ConditionalOnProperty
这种方法也是最推荐使用的,不需要升级到 Spring Boot 2.1 不过同样需要在 yml 中增加 enable
配置。
具体思路就是通过 @ConditionalOnProperty
来控制类ScheduleTask
是否生效,可以理解为如果 enable
是 false 那么ScheduleTask
就不会交给 Spring 控制。
3. cron 表达式 2.1 版本新增
在 Spring Boot 2.1 版本开始,cron 中增加了 public static final String CRON_DISABLED = "-";
当需要停止定时任务时可以通过修改配置文件中 cron 的值为 -
停止定时任务。
注意: yml 中 -
是特殊符号用来表示集合的元素,所以配置的时候需要加上单引号。
版权声明: 本文为 InfoQ 作者【码狐】的原创文章。
原文链接:【http://xie.infoq.cn/article/f7bd9d54f7919ad51f050fe5a】。文章转载请联系作者。
评论