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触发*/
}