目录
1.4 fixedDelay和fixedDelayString
1.6 initialDelay和initialDelayString
前言:
定时任务在项目中可以这样写
@Scheduled(cron = "0 0 2 * * ?")
但是具体什么意思呢?这是一种表达式
当然@Scheduled 还有别的用法
不过作为一个程序员,首先英文还是要专业点。
scheduled -----> [ˈskedʒuːld] (USA)
1.cron 表达式
Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式:
1.Seconds Minutes Hours DayofMonth Month DayofWeek Year
2.Seconds Minutes Hours DayofMonth Month DayofWeek
其实就是
秒 分 时 日 月 周 年
但是日和周是有对立的,只有一个能有值,另一个应该为问号。
至于year 有没有都可以
(这边年的地方可以留空)
序号 | 说明 | 必填 | 允许填写的值 | 允许的通配符 |
---|---|---|---|---|
1 | 秒 | 是 | 0-59 | , - * / |
2 | 分 | 是 | 0-59 | , - * / |
3 | 时 | 是 | 0-23 | , - * / |
4 | 日 | 是 | 1-31 | , - * ? / L W |
5 | 月 | 是 | 1-12 / JAN-DEC | , - * / |
6 | 周 | 是 | 1-7 or SUN-SAT | , - * ? / L # |
7 | 年 | 否 | 1970-2099 | , - * / |
1.1 每一个域可出现的字符
Seconds: 可出现", - * /"四个字符,有效范围为0-59的整数
Minutes: 可出现", - * /"四个字符,有效范围为0-59的整数
Hours: 可出现", - * /"四个字符,有效范围为0-23的整数
DayofMonth :可出现", - * / ? L W C"八个字符,有效范围为0-31的整数
Month: 可出现", - * /"四个字符,有效范围为1-12的整数或JAN-DEc
DayofWeek: 可出现", - * / ? L C #"四个字符,有效范围为1-7的整数或SUN-SAT两个范围。1表示星期天,2表示星期一, 依次类推
Year: 可出现", - * /"四个字符,有效范围为1970-2099年
每一个域都使用数字,但还可以出现如下特殊字符,它们的含义是:
(1) *:表示匹配该域的任意值,假如在Minutes域使用*, 即表示每分钟都会触发事件。
(2) ?:只能用在DayofMonth和DayofWeek两个域。DayofMonth和 DayofWeek会相互影响。
(就是这个DayofMonth和DayofWeek 这两个只能有一个有值,另外一个应该为问号。
有点像是对立事件)
(3) -:表示范围,例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次
(4) /:表示起始时间开始触发,然后每隔固定时间触发一次,例如在Minutes域使用5/20,则意味着5分钟触发一次,而25,45等分别触发一次.
(5) , :表示列出枚举值。例如:在Minutes域使用5,20,则意味着在5和20分每分钟触发一次。
(6) L:就是Last的意思,只出现在DayofWeek和DayofMonth中。
如果L前面有具体的内容,比如6L就代表这个月的倒数第六天。
使用L的时候,不能使用范围。
(7) W:表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。例如:在 DayofMonth使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一 到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份。
(8) LW:这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。
(9) #:用于确定每个月第几个星期几,只能出现在DayofWeek域。(只能出现在周这里)
#
序号(表示每月的第几个周几),例如在周字段上设置”5#2”表示在每月的第2个周五
1.2 关于定时任务的一些思考与用法
定时任务其实是可以写到配置文件里面的,但是看有没有必要。
也就是定时任务中的cron表达式可以支持使用占位符来进行实现。
写在yml文件中,然后比如
scheduled:
cron: 0 0 2 * * ?
interval: 10
每5秒执行一次:
@Scheduled(cron="${scheduled.cron}")
//执行任务
@Scheduled(cron="*/${scheduled.interval} * * * * *")
//执行任务
有点类似于mybatis的那种占位符
1.2.1 占位符
- 1)java中一种占位符是类似于c语言中的占位符,使用String类的format()方法
比如:
str=String.format("Hi,%s", "hehe");
System.out.println(str);
不过这种写法在java中真是很少见了。
- 2)使用{}来当占位符,使用MessageFormat.format转换(不过这种在mybatis那种就是一样意思的占位符)
package com.middleware.study;
import java.text.MessageFormat;
/**
* @Description : FormatTest
* @Date : 2019/10/9
* @Author : pmdream
*/
public class FormatTest {
public static void main(String[] args) {
String str = "我叫{0},今年{1}岁。";
String name = "hehe";
String age = "23";
str = MessageFormat.format(str, name, age);
System.out.println(str);
}
}
结果如下:我叫hehe,今年23岁。
1.3 启动服务的时候就执行任务
实现InitializingBean,并且重写afterPropertiesSet
@Override
public void afterPropertiesSet() throws Exception {
this.init(); //进行定时任务初始化就可以了
}
1.4 fixedDelay和fixedDelayString
上一次执行完成之后,经过多久再次执行;
这两个意思相同,只不过fixedDelayString 支持占位符,而且这个是字符串形式的(正因为是字符串所以支持~)
1.5 fixedRate和fixedRateString
觉得与fixedDelay类似
fixedRateString也是字符串形式,支持占位符
@Scheduled(fixedRate = 10000) //上一次开始执行时间点之后10秒再执行
1.6 initialDelay和initialDelayString
@Scheduled(initialDelay=10000, fixedRate=5000) //第一次延迟10秒后执行,之后按fixedRate 五秒执行一次
参考:(但是感觉这个博主有的例子举得都是有问题的,所以自己进行了修改)
https://www.cnblogs.com/dyppp/p/7498457.html
https://www.cnblogs.com/xiang--liu/p/11378860.html