SpringBoot定时器
- 1 介绍
- 2 注解
- 3 代码
- 4 Cron表达式
- 1. 格式
- 2. 取值
- 3. 特殊字符
- 4. 经典案例
- 5 Cron既然那么麻烦就生成吧
1 介绍
定时器是一种控制任务延时调用,或者周期调用的技术。
作用:定时邮件、短信发送、更新数据、同步数据、检查数据库和缓存数据是否一致、将定时任务限制在每天的工作时间等。
首先要有web的依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
2 注解
注解 | 作用 | 位置 |
---|---|---|
@EnableScheduling | 开启定时器 | 启动类上,或者定时器上 |
@Scheduled | 定时器任务,并指定cron表达式 | 定时器方法上 |
3 代码
package com.example.springjpaquery.schedule;import cn.hutool.core.date.DateUtil;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;import java.time.LocalDateTime;/*** 定时器测试类* @version 1.0.0* @date 2022/10/20*/
@Component
@EnableScheduling
@EnableAsync // 异步注解 @EnableAsync+@Async配合使用,这里只是简单记录
public class TestSchedule {/*** 每10秒执行一次*/@Scheduled(cron = "0/10 * * * * ?")@Asyncpublic void handler() {System.out.println(DateUtil.now());}
}
4 Cron表达式
1. 格式
七部分组成,其格式为:
秒 分 时 日 月 周 年(可为空)
2. 取值
位置 | 介绍 | 取值 |
---|---|---|
1 | 秒 | 0-59 |
2 | 分 | 0-59 |
3 | 时 | 0-24 |
4 | 日 | 1-31 |
5 | 月 | 1-12 |
6 | 星期 | 1-7 |
7 | 年 | 可为空,1970-2099,若为空,表示全部时间范围 |
3. 特殊字符
字符 | 解释 |
---|---|
* | 每的意思。在不同的字段上,就代表每秒,每分,每小时等。如果在“日”这个域中设置 *,表示每一天都会触发。 |
- | 指定值的范围。这个比较好理解就是指定在某个域的连续范围,如果我们在 “时” 这个域中定义 1-6,则表示在1到6点之间每小时都触发一次,用 , 表示 1,2,3,4,5,6 |
, | 这里指的是在两个以上的时间点中都执行,如果我们在 “分” 这个域中定义为 8,12,35 ,则表示分别在第8分,第12分 第35分执行该定时任务。 |
/ | 在某个域上周期性触发,该符号将其所在域中的表达式分为两个部分,其中第一部分是起始值,除了秒以外都会降低一个单位,比如 在 “秒” 上定义 5/10 表示从 第 5 秒开始 每 10 秒执行一次,而在 “分” 上则表示从 第 5 秒开始 每 10 分钟执行一次。 |
? | 仅用于【日】和【周】字段。因为在指定某日和周几的时候,这两个值实际上是冲突的,所以需要用【?】标识不生效的字段。比如【0 1 * * * ?】就代表每年每月每日每小时的1分0秒触发任务。这里的周就没有效果了。使用的场景为不需要关心当前设置这个字段的值。例如:要在每月的8号触发一个操作,但不关心是周几,我们可以这么设置 0 0 0 8 * ? |
L | 表示英文中的LAST 的意思,只能在 “日”和“周”中使用。在“日”中设置,表示当月的最后一天(依据当前月份,如果是二月还会依据是否是润年), 在“周”上表示周六,相当于”7”或”SAT”。如果在”L”前加上数字,则表示该数据的最后一个。例如在“周”上设置”7L”这样的格式,则表示“本月最后一个周六” |
W | 表示离指定日期的最近那个工作日(周一至周五)触发,只能在 “日” 中使用且只能用在具体的数字之后。若在“日”上置”15W”,表示离每月15号最近的那个工作日触发。假如15号正好是周六,则找最近的周五(14号)触发, 如果15号是周未,则找最近的下周一(16号)触发.如果15号正好在工作日(周一至周五),则就在该天触发。如果是 “1W” 就只能往本月的下一个最近的工作日推不能跨月往上一个月推。 |
# | 表示每月的第几个周几,只能作用于 “周” 上。例如 ”2#3” 表示在每月的第三个周二。 |
4. 经典案例
"30 * * * * ?" 每半分钟触发任务
"30 10 * * * ?" 每小时的10分30秒触发任务
"30 10 1 * * ?" 每天1点10分30秒触发任务
"30 10 1 20 * ?" 每月20号1点10分30秒触发任务
"30 10 1 20 10 ? *" 每年10月20号1点10分30秒触发任务
"30 10 1 20 10 ? 2011" 2011年10月20号1点10分30秒触发任务
"30 10 1 ? 10 * 2011" 2011年10月每天1点10分30秒触发任务
"30 10 1 ? 10 SUN 2011" 2011年10月每周日1点10分30秒触发任务
"15,30,45 * * * * ?" 每15秒,30秒,45秒时触发任务
"15-45 * * * * ?" 15到45秒内,每秒都触发任务
"15/5 * * * * ?" 每分钟的每15秒开始触发,每隔5秒触发一次
"15-30/5 * * * * ?" 每分钟的15秒到30秒之间开始触发,每隔5秒触发一次
"0 0/3 * * * ?" 每小时的第0分0秒开始,每三分钟触发一次
"0 15 10 ? * MON-FRI" 星期一到星期五的10点15分0秒触发任务
"0 15 10 L * ?" 每个月最后一天的10点15分0秒触发任务
"0 15 10 LW * ?" 每个月最后一个工作日的10点15分0秒触发任务
"0 15 10 ? * 5L" 每个月最后一个星期四的10点15分0秒触发任务
"0 15 10 ? * 5#3" 每个月第三周的星期四的10点15分0秒触发任务
"0 0 10,14,16 * * ?" 每天上午10点,下午2点,4点
"0 0/30 9-17 * * ?" 朝九晚五工作时间内每半小时
"0 0 12 ? * WED" 表示每个星期三中午12点
"0 0 12 * * ?" 每天中午12点触发
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
"0 15 10 15 * ?" 每月15日上午10:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发
"/5 * * * * ?" 每隔5秒执行一次
"0 */1 * * * ?" 每隔1分钟执行一次
"0 0 23 * * ?" 每天23点执行一次
"0 0 1 * * ?" 每天凌晨1点执行一次
"0 0 1 1 * ?" 每月1号凌晨1点执行一次
"0 0 23 L * ?" 每月最后一天23点执行一次
"0 0 1 ? * L" 每周星期天凌晨1点实行一次
"0 26,29,33 * * * ?" 在26分、29分、33分执行一次
"0 0 0,13,18,21 * * ?" 每天的0点、13点、18点、21点都执行一次
"0 0 3 ? * L" 每周周六凌晨3点实行一次
"0 24,30 * * * ?" 在24分、30分执行一次
若值不合法,调度器将抛出SchedulerException异常
5 Cron既然那么麻烦就生成吧
嘎嘎好用https://cron.qqe2.com/