本文是通过 @Scheduled 和 @EnableScheduling 配合使用完成定时任务。
将@EnableScheduling放在项目主启动类类名上方,
将@Scheduled注解放在待定时的方法名上方,并设置 cron 参数即可。
直接上案例:
启动类
package com.gump;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling//开启定时任务
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
定时任务类
package com.gump.job;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* 最简单的定时任务
*/
@Component
public class ScheduledTask {
@Scheduled(cron = "*/10 * * * * ?")
// @Scheduled(fixedDelay = 10000)
// @Scheduled(fixedRate = 10000)
public void startTask(){
System.out.println("每隔10秒执行一次:" + new Date());
}
}
@EnableScheduling 的作用
见名之意,可简单理解为:开启了定时任务,会去扫描含有 @Scheduled 注解的方法,并按频率执行。
@Scheduled 的作用
标注方法为定时任务方法,并为方法配置执行频率(必须指定 cron,fixedDelay或fixedRate属性之一)。
@Scheduled注解参数如下:
参数 | 说明 | 示例 |
---|---|---|
cron | 任务执行的cron表达式,可以灵活配置任务的执行频率。 | @Scheduled(cron = “*/10 * * * * ?”) |
zone | cron表达时解析使用的时区,默认为服务器的本地时区。使用java.util.TimeZone#getTimeZone(String)方法解析。 | GMT-8:00 |
fixedDelay | 固定延迟:上一次任务执行结束到下一次执行开始的间隔时间固定,单位为ms。 | @Scheduled(fixedDelay = 10000) |
fixedDelayString | 与fixedDelay一致,只是间隔时间使用java.time.Duration#parse解析。 | |
fixedRate | 固定速率:上一次任务执行开始到下一次执行开始的间隔时间固定,单位为ms。若在调度任务执行时,上一次任务还未执行完毕,会加入worker队列,等待上一次执行完成后,马上执行下一次任务。 | @Scheduled(fixedRate = 10000) |
fixedRateString | 与fixedRate一致,只是间隔时间使用java.time.Duration#parse解析。 | |
initialDelay | 首次延迟多长时间后执行,单位ms。之后按照fixedRate、fixedRateString、fixedDelay、fixedDelayString指定的规则执行,需要指定其中一个规则。注意:不能和cron一起使用。 | |
initialDelayString | 与initialDelay 一致,只是间隔时间使用java.time.Duration#parse解析。 |
一般我们使用 cron 进行配置,因此需要掌握 cron 的使用。
cron 表达式详解
cron 表达式从左到右用空格隔开分别是:【秒 分 时 日 月 周 年(可省略)】
时间域 | 取值范围 | 通配符 |
---|---|---|
秒 | 0~59 | , - * / |
分 | 0~59 | , - * / |
时 | 0~23 | , - * / |
日 | 1~31 | , - * ? / L W C |
月 | 1-12 或 JAN-DEC | , - * / |
周 | 0-6 或 SUN-SAT 1-6对应周一到周六,0对应星期天 | , - * ? / L C # |
年(非必填) | , - * / |
cron 表达式中的符号说明:
符号 | 说明 |
---|---|
数字 | 数值,出现在对应的时间域表示对应的时间。例如:cron = “6 5 4 3 2 ?” 中,6指6秒,5指5分,4指4点,3指3号,2指2月。 |
*(通配符) | 匹配任意值,例如* * * * * ?表示每秒执行一次任务。 |
?(无意义占位符) | 忽略,语义相当于不管… 比如第六个位置的?就表示不管当前是周几就会执行。为了避免日和周的时间冲突,日和周其中一个需配置为 ? 。 |
/(步长) | 间隔,语义相当于每隔… 例如第三个时间域(时)的 2/5表示从2点开始每隔5小时。 |
-(范围) | 区间,用于指定一个范围内的取值,例如0 0 9-17 * * MON-FRI表示周一至周五的9点到17点之间每小时执行一次任务。 |
,(列表) | 枚举,用于指定多个取值,例如0 0 6,12,18 * * ?表示每天6点、12点和18点执行任务。 |
L(Last) | 表示某个指定时间内的最后一天,比如0 0 L * * ?表示每月的最后一天执行任务。 |
W(Weekday) | 表示距离指定日期最近的工作日,比如0 0 0 15W * ?表示当月第15个工作日执行任务。如果15号是工作日,则执行任务;如果15号是周末,则任务会提前到最近的工作日即14号执行。 |
C(Calendar) | 表示距离指定日期最近的那个日子,比如0 0 0 1C * ?表示当月的第一个工作日执行任务。如果1号是工作日,则执行任务;如果1号是周末,则任务会延后到最近的工作日即2号执行。 |
#(日历偏移量) | 用于指定某个月份的第几个周几,例如0 0 0 ? * 3#1表示每个月的第一个星期三执行任务。 |
现在我们可以根据需要进行 cron 表达式的配置了。常用的 cron 表达式如下:
表达式 | 描述 |
---|---|
0/2 * * * * ? | 每2秒 触发 |
0 0/2 * * * ? | 每2分钟 触发 |
0 0 9 * * ? | 每天9点触发 |
0 0 9 10 * ? | 每月10号9点触发 |
0 0 23 L * ? | 每月最后一天23点触发 |
0 0 9,17 W * ? | 工作日的9点和17点触发 |
0 0 9,17 ? * 5#4 | 每月的第四个星期五触发 |
给大家提供一个好用的工具,用于练习cron表达式的编写:在线Cron表达式生成器
完成最简单的定时任务之后,我们要考虑定时任务的集中管理和可配置化,定时任务的动态新增和删除等。拓展内容会放在后面的篇章,点关注,不迷路。