引入
1.启动类上加上注解
2.新建一个定时任务的管理类,交给Spring管理
案例
案例1:fixedRate
//上次任务开始到下次任务开始的时间间隔为5秒
//每隔5秒执行一次,不需要等上个任务执行完
@Scheduled(fixedRate = 5000)
public void mask01() throws InterruptedException {
log.info("mask01任务开始:{}", printTime());
Thread.sleep(2000);
log.info("mask01任务结束:{}", printTime());
}
案例2:fixedDelay
//上次任务结束到下次任务开始的时间间隔为5秒
//每隔5秒执行一次,需要等上个任务执行完
@Scheduled(fixedDelay = 5000)
public void mask02() throws InterruptedException {
log.info("mask02任务开始:{}", printTime());
Thread.sleep(2000);
log.info("mask02任务结束:{}", printTime());
}
案例3:initialDelay
//刚开始延迟10秒,然后开始执行任务,之后的每个任务完成后延迟5秒执行
@Scheduled(initialDelay = 10000, fixedDelay = 5000)
public void mask03() throws InterruptedException {
log.info("mask03任务开始:{}", printTime());
Thread.sleep(2000);
log.info("mask03任务结束:{}", printTime());
}
案例4:cron表达式(表达式的书写了解即可,有需求问ai)
Cron表达式是一种用于调度任务的时间表达式,广泛应用于各种计划任务、定时任务等场景。下面将对Cron表达式进行详细讲解:
一、Cron表达式的结构
Cron表达式由6或7个字段组成,每个字段代表一个时间元素,字段之间用空格分隔。这些字段按顺序依次为:
- 秒(0~59)
- 分(0~59)
- 时(0~23)
- 日(月)(1~31,但要考虑月份的天数)
- 月(112,或JANDEC)
- 周几(17,1=周日,或SUNSAT)
- 年(可选,留空或1970~2099)
注意:在实际应用中,Cron表达式可能只有前6个字段,没有年份字段。
二、Cron表达式的含义
每个字段可以是一个具体的值、一个连续区间、一个间隔时间、一个列表或通配符。具体含义如下:
- 具体的值:表示在指定的时间点执行任务。例如,小时字段为12表示在每天的中午12点执行任务。
- 连续区间:表示在指定的时间范围内每分钟/每小时/每天等执行任务。例如,分钟字段为5~20表示从5分到20分钟每分钟触发一次。
- 间隔时间:表示从起始时间开始,每隔固定时间触发一次。例如,小时字段为8~18/4表示从早上8点开始,每隔4小时触发一次。
- 列表:表示在指定的多个时间点执行任务。例如,周几字段为1,3,5表示在每周的周一、周三和周五执行任务。
- 通配符(*):表示匹配该字段的任意值。例如,分钟字段为*表示每分钟都会触发事件。
三、Cron表达式的特殊字符和符号
Cron表达式还支持一些特殊字符和符号,用于更灵活地指定任务的执行时间:
- 问号(?):只能用于日和周几字段,表示不指定值。因为日和周几字段是互斥的,必须对其中一个设置?以避免冲突。
- 斜杠(/):用于指定某个字段的间隔值。例如,分钟字段为*/5表示每隔5分钟触发一次。
- 连接符(-):用于指定某个字段的取值范围。例如,小时字段为9~17表示在朝九晚五工作时间内每小时触发一次。
- 逗号(,):用于指定某个字段的多个取值。例如,日字段为1,15表示在每月的1日和15日执行任务。
- L:表示某个字段的最后一个取值。只能出现在日和周几字段。例如,日字段为L表示在每月的最后一天执行任务。
- W:表示离指定日期最近的有效工作日(周一到周五)。只能出现在日字段。例如,日字段为5W表示如果5日是星期六,则将在最近的工作日(星期五)即4日触发;如果5日是星期天,则在6日(周一)触发;如果5日在星期一到星期五中的一天,则就在5日触发。
- LW:这两个字符可以连用,表示在某个月最后一个工作日。例如,日字段为LW表示在每月的最后一个工作日执行任务。
- #:用于指定某个月份的第几个星期几。只能出现在周几字段。例如,周几字段为5#2表示在每月的第二个周四执行任务。
常见例子
(1)0 0 2 1 * ? 表示在每月的1日的凌晨2点调整任务
(2)0 15 10 ? * MON-FRI 表示周一到周五每天上午10:15执行作业
(3)0 15 10 ? 6L 2002-2006 表示2002-2006年的每个月的最后一个星期五上午10:15执行作
(4)0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
(5)0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时
(6)0 0 12 ? * WED 表示每个星期三中午12点
(7)0 0 12 * * ? 每天中午12点触发
(8)0 15 10 ? * * 每天上午10:15触发
(9)0 15 10 * * ? 每天上午10:15触发
(10)0 15 10 * * ? * 每天上午10:15触发
(11)0 15 10 * * ? 2005 2005年的每天上午10:15触发
(12)0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发
(13)0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发
(14)0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
(15)0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发
(16)0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发
(17)0 15 10 ? * MON-FRI 周一至周五的上午10:15触发
(18)0 15 10 15 * ? 每月15日上午10:15触发
(19)0 15 10 L * ? 每月最后一日的上午10:15触发
(20)0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发
(21)0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一个星期五上午10:15触发
(22)0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发
(23)0/20 * * * * ? 表示每20秒 调整任务
//在每天的22:00:00执行
@Scheduled(cron = "00 00 22 * * * ")
public void mask04() throws InterruptedException {
log.info("mask04任务开始:{}", printTime());
Thread.sleep(2000);
log.info("mask04任务结束:{}", printTime());
}