运用Spring Task设置定时任务

以下部分内容转载自

http://blog.csdn.net/u011116672/article/details/52517247       --------深入浅出Spring task定时任务

https://unmi.cc/understand-spring-schedule-fixedrate-fixeddelay/#more-8252       --------fixedDelay与fixedRate的区别

针对定时任务的处理,Spring Task中提供了两种接口TaskExecutorTaskScheduler可以调用。这里补充下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代表星期六,支持的符号相比秒多了?,表达的含义是与{日期}互斥,即意味着若明确指定{日期}触发,则表示{星期}无意义。

猜你喜欢

转载自blog.csdn.net/keep_moveon/article/details/78867777