天天看点

定时任务@Scheduled

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import com.shareit.springbootDemo.utils.TimeUtils;

import lombok.extern.slf4j.Slf4j;

/**
 * 定时任务
 */

@Slf4j
@Component
public class TimeTask {
	/**需要在启动类中注解@EnableScheduling才能开启
	 * 当存在多个定时任务同时执行或一个定时任务同时执行多次时 需要在启动类中配置线程池防止串行
	 * 定时任务注解后的配置参数有 fixedDelay fixedRate cron ,其中fixedDelay需要任务执行完后才计时开始  fixedRate表示每隔多少时间执行 
	 * fixedDelay可以与initialDelay一起使用,后者表示容器启动后第一次执行任务的延时时间
	 * 三者的差异:
	 * 	fixedDelay的间隔是 前次任务的结束与下次任务的开始,fixedRate 任务两次执行时间间隔是任务的开始点;
	 * 对 fixedRate 还有一个误区就是,以为任务时长超过 fixedRate 时会启动多个任务实例,其实不会; 只不过会在上次任务执行完后立即启动下一轮。除非这个 Job 方法用 @Async 注解了,
	 * 使得任务不在 TaskScheduler 线程池中执行,而是每次创建新线程来执行。
	 * 
	 * cron 配置间隔时间时,提前设置好任务执行的时间点,如果计划执行时任务未结束则下个计划点再执行(以秒为单位的测试结果)
	 * 
	 * cron表示执行任务的时间,前两个都是配置数字 这个cron配置如下:
	 * cron = "${toDoTaskTime}" 可以在配置文件中配置任务执行的启动时间
	 * 从左到右依次是秒 分 时  日  月 星期几 年份,不同的单位数之间必须用空格隔开   
	 * 单位		 允许值    		允许的特殊字符 
	 * 秒		0~59			, - * /
	 * 分		0~59			, - * /
	 * 小时		0~23			, - * /
	 * 日期		1~31			, - * / ? L W C
	 * 月份		1~12或者JAN~DEC	, - * /
	 * 星期		1~7或者SUN~SAT	, - * ? / L C #  其中1表示星期日
	 * 年(可选)	留空,1970~2099	, - * /
	 * 
	 * 特殊字符的含义:, 表示多个值,列出枚举值	- 表示区间,闭区间,指定一个范围		* 表示所有可能的值,匹配该区域的任意值	
	 * 				/ 指定一个值的增加幅度,步长,用于递增触发	? 表示不确定的值,只能用在日期和星期区域上,以免冲突
	 * 				L 表示最后的意思   (0 23 2 ? * L * 表示每月的星期六2点23分0秒执行,其他时候与数字组合表示最后一个星期几,在日期上表示最后一天
	 * 在日期上还不确定能不能与数字组合)	W 表示指定日期最近的工作日那天执行,必须有数字即指定日期,寻找最近的工作日时不会跨过月份
	 * C 可用于“日”和“周几”字段,它是"calendar"的缩写。它表示为基于相关的日历所计算出的值(如果有的话)。如果没有关联的日历,那它等同于包含全部日历。
	 * “日”字段值为"5C"表示"日历中的第一天或者5号以后",“周几”字段值为"1C"则表示"日历中的第一天或者周日以后"
	 * “#”字符:表示该月第几个周X。例如:6#3表示该月第3个周五
	 * @throws InterruptedException 
	 */
	@Scheduled(cron = "1/2 * * * * ?")
	public void task() throws InterruptedException {
		/*log.info("任务开始");
		Thread.sleep(5002);
		log.info("任务结束");*/
		
	}
	
	@Scheduled(cron = "1/3 * * * * ?")
	public void task2() throws InterruptedException {
		/*log.info("任务开始");
		Thread.sleep(5002);
		log.info("任务结束");*/
		
		
	}
	
	/*
	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触发*/
}