前言
定时任务的使用,在开发中可谓是家常便饭了,定时发送邮件、短信。避免数据库,数据表过大,定时将数据转储。通知、对账等等场景。
当然实现定时任务的方式也有很多,比如使用 linux下的 crontab 脚本,jdk 中自带的 Timer 类。Spring Task或是 Quartz 。
相信你也有过如下的疑问:
-
Spring Task 的 crontab 的表达式 和linux下的 crontab 有什么区别?
-
crontab 表达式记不住?
-
定时任务阻塞会有什么影响?
-
多个定时任务的情况下如何运行的?
-
具有相同表达式的定时任务,他们的执行顺序如何?
-
为什么async异步任务没有生效?
所以这篇文章,我们来介绍一下,在 Spring Task 中, 定时任务的执行原理及相关问题。演示环境为 Spring Boot 项目。
SpringBoot 定时任务的原理
相信绝大部分开发者都使用过 Spring Boot ,它为我们提供的 Starter 包含了定时任务的注解。所以我们来主要介绍一下 Spring Boot 实现定时任务的原理,和其相关注解的作用。
Spring 在 3.0版本后通过 @Scheduled 注解来完成对定时任务的支持。
在使用时,需要在Application 启动类上加上 @EnableScheduling 注解,它是从Spring 3.1后开始提供的。
由于Spring3 版本较低,使用得比较少了,我们使用高版本可能并不会考虑太多细节,大多只需要关注目标实现,所以我们在配套使用两个注解的时候,并不会出现什么问题。
在3.0 中 ,是通过
<!-- 配置任务线性池 -->
<!-- 任务执行器线程数量 -->
<task:executor id="executor" pool-size="3" />
<!-- 任务调度器线程数量 -->
<task:sc