例子:周期性的定时任务(例如每周五 23:59:59 例行执行巡视任务)
在某个时间点周期性执行任务,例如每周五 23:59:59 例行执行巡视任务
1.开启定时任务
开启定时任务只需要在 Spring Boot 的启动类上声明 @EnableScheduling 即可,实现代码如下:
@SpringBootApplication
@EnableScheduling // 开启定时任务
public class DemoApplication {
//dothing
}
2.添加定时任务
定时任务的添加只需要使用 @Scheduled 注解标注即可,如果有多个定时任务可以创建多个 @Scheduled 注解标注的方法,示例代码如下:
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component // 把此类托管给 Spring,不能省略
public class TaskUtils {
// 添加定时任务
@Scheduled(cron = "59 59 23 0 0 5") // cron 表达式,每周五 23:59:59 执行
public void doTask(){
System.out.println("我是定时任务~");
//1.查询所有需要判断是否过期的数据
//2.遍历数据,时间(使用Date)
For(Order o:orderList){
//Date:new Date()获取当前时间,再使用before与需要判断的业务数据的时间进行比较,判断数据是否过期(也可以使用after)
//LocalDateTime:LocalDateTime.now()获取当前时间,再使用isBefore与需要判断的业务数据的时间进行比较,判断数据是否过期(也可以使用isAfter)
//LocalDate:LocalDate.now()获取当前时间,再使用isBefore与需要判断的业务数据的时间进行比较,判断数据是否过期(也可以使用isAfter)
If(order.getDeadline().before(new Date())){
//3.调用提醒服务接口,新增一条提醒数据
//4.修改数据过期的状态
}
}
2.cron表达式的用法
1.按顺序依次为
秒 分 时 天 月 周 年 表达式长度为6个或者7个
cron表达式是一个字符串,分为6或7个域,每两个域之间用空格分隔,其语法格式为:
“秒域 分域 时域 日域 月域 周域 年域”
其中,年域可以省略,省略时表示每年。
1 秒(0~59)
2 分钟(0~59)
3 小时(0~23)
4 天(0~31)
5 月(0~11)
6 星期(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)
7.年份(1970-2099)
2.一些符号的意义
(1)* 表示可以匹配该域的所有值;
例如,"0 0 13 * * ?"表示每天的13点执行一次。
(2)?在cron表达式中必须出现且只能出现1次,用在日域或周域上,表示不确定值、不限制值;
它与*的区别是,并不能匹配到该域上的所有值,例如指定了3月份每个周五,那么3月份的周五可能只有4个值;
例如,"0 0 5 6 * ?"表示每个月6日5点钟执行而无论周几,"0 0 5 ? * 3"表示每个周三5点钟执行而无论是几号。
(3)- 表示匹配该域上的一个范围;
例如,"0 30 9-15 ? * *"表示每天的9:30-15:30每小时执行一次,"0 1-5 * ? * 1"表示每周日每个小时的1-5分钟每分钟执行一次。
(4), 表示枚举值;
例如,"0 0 8,16,23 ? * 1,7"表示每个周六日的8点、16点、23点各执行一次。
(5)/ 表示起始时间和间隔时间;
例如,"0 0 3/5 * * ?"表示每天3点开始执行,每隔5个小时执行一次,即3点、8点、13点、18点、23点各执行一次,
"*/5 * * * * ?"表示每隔5秒钟执行一次,"0 */1 * * * ?"表示每隔1分钟执行一次。
(6)# 只能用于周域上,#后面的数字表示第几周,如果不存在这个周的值,则不执行;
例如,"0 0 0 ? * 5#2"表示每个月第2个周四零点执行,"15 30 6 ? * 7#5"表示每个月第5个周六6:30:15执行,如果某个月不存在第5个周六,则不执行。
(7)L 只能用于日域或周域,用于日域时表示当月最后一天,用于周域如果前面不加数字表示周六,加数字表示最后一个周值;
例如,"0 0 23 L * ?"表示每月最后一天的23点执行,"0 0 23 ? * L"表示每周六的23点执行,"0 0 23 ? * 3L"表示每月最后一个周二的23点执行。
3.一些常见实例
3.fixedDelay和fixedRate的使用(以毫秒为单位)
1 2 | @Scheduled(fixedDelay = 5000) //上一次任务执行完毕时间点之后5秒再执行 @Scheduled(fixedRate = 5000) //上一次任务开始执行时间点之后5秒再执行 |