任务调度
任务调度是为了让系统自动完成任务,在约定好的特定时刻去执行任务的过程
列如:
- 在电商系统中需要在下午6点自动发送优惠卷
- 订票系统中根据车次不同,不同时间段分批发票
实现任务调度方法
- 多线程方式,利用sleep
- JDK提供的API:列如Timer,ScheduledExecutor
- 列如Quartz
- spring task
Spring Task实现定时任务
SpringBoot默认在无任何第三方依赖的情况下使用spring-context 模块提供的定时任务工具spring Tack。我们只需要使用@EnableScheduling注解就可以开启相关的定时任务功能(实现类)
1.启动类添加注解
也就是说我们需要在启动类添加开启任务调度的注解(@EnableScheduling)
package com.zzyl;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling //开启任务调度
@EnableCaching
public class ZzylApplication {
public static void main(String[] args) {
SpringApplication.run(ZzylApplication.class, args);
}
}
2.自定义定时任务类
package com.zzyl.task;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
/**
* @author sjqn
*/
@Component
@Slf4j
public class MyTask {
/**
* 定时任务 每隔5秒触发一次
*/
@Scheduled(cron = "0/5 * * * * ?")
public void executeTask(){
log.info("定时任务开始执行:{}", LocalDateTime.now());
}
}
添加@Component注解受容器管理,注解@Scheduled()定义定时任务类
其中设计到了cron表达式
cron表达式
我们在设置时间频率的时候,通常情况下都会使用cron表达式来表达
cron表达式是一个字符串,用来设置定时规则,由其部分组成,每部分中间用空格隔开
组合部分 | 含义 | 取值范围 |
---|---|---|
第一部分 | Seconds(秒) | 0-59 |
第二部分 | Minutes(分) | 0-59 |
第三部分 | Hours(时) | 0-23 |
第四部分 | Day-of-Month(天) | 1-31 |
第五部分 | Month(月) | 0-11 |
第六部分 | Day-of-Week(星期) | 1-7 |
第七部分 | Year(年) | 1970-2099 |
此外,cron表达式还可以包含一些特殊符号来设置更加灵活的定时规则
符号 | 含义 |
---|---|
? | 表示不确定的值,当两个子表达式其中一个被指定了值以后,为了避免冲突,需要将另外一个的值设为"?"。例如:想在每月20日触发调度,不管20号时星期几,只能用如下写法:0 0 0 20 * ? ,其中最后一位只能用"?" |
* | 代表所有可能的值 |
, | 设置多个值,列如"26,29,33" 表示在26分,29分,33分各自运行一次任务 |
- | 设置取值范围,列如"5-20",表示从5分到20分钟,每分钟运行一次任务 |
/ | 设置频率或间隔,如"1/15"表示从1分开始,每隔15分种运行一次任务 |
L | 用于每月,或每周,表示每月的最后一天,或每个月的最后星期几,列如"6L"表示每月的最后一个星期六 |
W | 表示离给定日期最近的工作日,列如"15W"放在每月上表示离本月15日最近的工作日 |
# | 表示该月第几个周X,列如"6#3"表示该月第三个周五 |
例子
cron表达式 | 含义 |
---|---|
*/5 * * * * ? | 每隔5秒运行一次任务 |
0 0 23 * * ? | 每天23点运行一次任务 |
0 0 1 1 * ? | 每月1号凌晨1点运行一次任务 |
0 0 23 L * ? | 每月最后一天23点运行一次任务 |
0 26,29,33 * * * ? | 在26分,29分,33分运行一次任务 |
0 0/30 9-17 * * ? | 朝九晚五工作时间内每半小时运行一次任务 |
0 15 10 ? * 6#3 | 每月的第三个星期五上午10:15运行一次任务 |