SpringBoot对定时任务的支持

概述

在企业的实践生产中,可能需要使用一些定时任务。例如,在月末、季末和年末需要统计各种各样的报表,月表需要月末跑批量生成,季表需要季末跑批量生成,这样就需要制定不同的定时任务。

使用

在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接口的scheduleAtFixedRatescheduleWithFixedDelay,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/

发表评论

电子邮件地址不会被公开。