概述
在企业的实践生产中,可能需要使用一些定时任务。例如,在月末、季末和年末需要统计各种各样的报表,月表需要月末跑批量生成,季表需要季末跑批量生成,这样就需要制定不同的定时任务。
使用
在Spring中配置定时任务的方法:
首先在配置类中加入@EnableScheduling
,然后通过注解@Scheduled
去配置如何定时。
示例:
@Service
public class ScheduleService {
//计数器
int count = 1;
//每隔一秒执行一次
@Scheduled(fixedRate = 1000)
//使用异步执行
@Async
public void scheduledTask(){
System.out.println("scheduledTask执行第"+count+"次");
count++;
}
}
启动SpringBoot程序,可以观察到控制台打印信息:
2020-03-11 19:00:03.436 INFO 7360 --- [l-thread-pool-1] c.rhett.bootweb.service.ScheduleService : scheduledTask执行第1次
2020-03-11 19:00:04.432 INFO 7360 --- [l-thread-pool-2] c.rhett.bootweb.service.ScheduleService : scheduledTask执行第2次
2020-03-11 19:00:05.433 INFO 7360 --- [l-thread-pool-3] c.rhett.bootweb.service.ScheduleService : scheduledTask执行第3次
2020-03-11 19:00:06.432 INFO 7360 --- [l-thread-pool-4] c.rhett.bootweb.service.ScheduleService : scheduledTask执行第4次
2020-03-11 19:00:07.433 INFO 7360 --- [l-thread-pool-5] c.rhett.bootweb.service.ScheduleService : scheduledTask执行第5次
...
这说明每秒钟Spring都会运行这个标注了@Scheduled
的方法,并且使用了线程池(在SpringBoot对异步任务的支持中配置的)。
cron表达式
上面的@Scheduled
只是按照时间间隔执行,如果需要指定某个时间执行,就需要一些其他属性配置了,下面列出了@Scheduled
的一些属性:
属性 | 类型 | 描述 |
---|---|---|
cron | String | 使用表达式的方式定义任务执行时间 |
zone | String | 可以通过它设定区域时间 |
fixedDelay | long | 表示从上一个任务完成开始到下一个任务开始的间隔,单位为毫秒 |
fixedDelayString | String | 与fixedDelay相同,只是使用字符串,这样可以使用SpEL来引入配置文件的配置 |
initialDelay | long | 在Spring IoC容器完成初始化后,首次任务执行延迟时间,单位为毫秒 |
initialDelayString | String | 与initialDelay相同,只是使用字符串,这样可以使用SpEL来引入配置文件的配置 |
fixedRate | long | 从上一个任务开始到下一个任务开始的间隔,单位为毫秒 |
fixedRateString | String | 与fixedRate相同,只是使用字符串,这样可以使用SpEL来引入配置文件的配置 |
看到这些属性是不是有种莫名的熟悉?(假设你是我博客的忠实读者,虽然概率为0%,或者你也对jdk比较了解)
没错,在我之前写的一篇Java线程池详解中介绍了任务调度线程池ScheduledExecutorService有接近的功能,而在org.springframework.scheduling.ScheduledTaskRegistrar
这个类下面,也看到了有一个成员属性localExecutor,它的类型就是ScheduledExecutorService
。
所以fixedRate和fixedDelay就对应着ScheduledExecutorService接口的scheduleAtFixedRate
和scheduleWithFixedDelay
,delay要等到上一个任务完成才开始计算间隔时间,rate不用。
而cron这个属性在ScheduledExecutorService
中就没见过了,它是一个用来匹配时间表达式,方便我们定义在某个时间规则执行任务。cron的语法是:“秒 分 时 天 月 星期 年”,其中年可以省略。它们的取值都很接近自然表达,比如说分的取值0-59
,天的取值1-31
,月的取值1-12
,星期的取值1-7
,代表星期日到星期六(这点需要注意),也可以写英文缩写SUN-SAT
。
除了写具体的取值,还可以写通配符:
通配符 | 描述 |
---|---|
* | 表示任意值 |
? | 不指定值,用于处理天和星期配置的冲突 |
- | 指定时间区间,如对于星期,2-6代表的是星期一到星期五 |
/ | 指定时间间隔执行,/前面是开始值,/后面是步长,例如对于分钟,0/3代表从0分开始,每隔三分执行一次 |
L | 代表最后的,如对于星期,4L代表最后一个星期三 |
# | 前面是值,后面是第几个,如对于星期,6#3代表第三个星期五 |
, | 列举多个项,例如对于月份,3,5,7 代表每个3月、5月、7月 |
原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/springboot%e5%af%b9%e5%ae%9a%e6%97%b6%e4%bb%bb%e5%8a%a1%e7%9a%84%e6%94%af%e6%8c%81/