以下部分内容转载自
http://blog.csdn.net/u011116672/article/details/52517247 --------深入浅出Spring task定时任务
https://unmi.cc/understand-spring-schedule-fixedrate-fixeddelay/#more-8252 --------fixedDelay与fixedRate的区别
针对定时任务的处理,Spring Task中提供了两种接口TaskExecutor
和TaskScheduler
可以调用。这里补充下TaskScheduler中的定时注解@Scheduled的使用。有三种使用方式:
Ⅰ.
@Scheduled(fixedDelay = 1000) //固定延迟1s,每一秒执行一次该方法
public void StartFlow() {
//to do something
}
Ⅱ.
@Scheduled(fixedRate = 1000) //固定延迟1s,每一秒执行一次该方法
public void StartFlow() {
//to do something
}
针对fixedDelay与fixedRate的区别:
只是说是 fixedRate 任务两次执行时间间隔是任务的开始点,而 fixedDelay 的间隔是前次任务的结束与下次任务的开始。
大致用示意字符串来表示如下(每个 T1, 或 T2 代表任务执行秒数(每次任务执行时间不定),假定 fixedRate 或 fixedDelay 的值是 5 秒,用 W 表示等待的数)
fixedRate: T1.T1WWWT2.T2.T2WW.T3.T3.T3.T3.T3.T4.T4.T4.T4.T4.T4.T4T5T5WWWT6.T6........
fixedDelay: T1.T1.WWWWW.T2.T2.T2WWWWW.T3.T3.T3.T3.T3.WWWWW.T4.T4.T4.T4.T4.T4.T4.WWWWWT6.T6......
一般来说能理解到上面两个场景已经差不多了,相比而言 fixedDelay 简单些,盯着上一次任务的屁股就行。
Ⅲ.
或者更精细的执行时间设置:采用cron expression;@Scheduled(cron = "0 0 0/1 * * ?") //这里表示从每天0点开始每一小时执行一次该方法
public void matchContractInfo() {
//to do something
}
@Scheduled(cron = "0 0 6-8/1 * * ?") //这里表示从每天6点至8点的时间段里每隔1小时执行一次该方法
public void ContractInfo() {
//to do something
}
@Scheduled(cron = "0 0 6,8 * * ?") //这里表示从每天6点时,8点时执行一次该方法
public void ContractInfo() {
//to do something
}
在spring 4.x中已经不支持7个参数的cronin表达式了,要求必须是6个参数。cron表达式的格式如下:
{秒} {分} {时} {日期(具体哪天)} {月} {星期}
- 1
- 秒:必填项,允许的值范围是0-59,支持的特殊符号包括
,-
*
/
,,
表示特定的某一秒才会触发任务,-
表示一段时间内会触发任务,*
表示每一秒都会触发,/
表示从哪一个时刻开始,每隔多长时间触发一次任务。 - 分:必填项,允许的值范围是0-59,支持的特殊符号和秒一样,含义类推
- 时:必填项,允许的值范围是0-23,支持的特殊符号和秒一样,含义类推
- 日期:必填项,允许的值范围是1-31,支持的特殊符号相比秒多了
?
,表示与{星期}互斥,即意味着若明确指定{星期}触发,则表示{日期}无意义,以免引起冲突和混乱。 - 月:必填项,允许的值范围是1-12(JAN-DEC),支持的特殊符号与秒一样,含义类推
- 星期:必填项,允许值范围是1~7 (SUN-SAT),1代表星期天(一星期的第一天),以此类推,7代表星期六,支持的符号相比秒多了
?
,表达的含义是与{日期}互斥,即意味着若明确指定{日期}触发,则表示{星期}无意义。