哪个方法需要周期性执行,就在哪个方法上添加注解@Scheduled。通过这个注解可以设置执行任务的周期
@Scheduled注解常用的属性有:
| 属性名 | 说明 |
|---|---|
fixedDelay | 毫秒值(long类型)。表示:上次任务完毕后,间隔多长时间开始下次任务 |
fixedRate | 毫秒值(long类型)。表示:上次任务开始后,间隔多长时间开始下次任务 |
initialDelay | 毫秒值(long类型)。表示:延迟多长时间后,才开始第一次fixedDelay或fixedRate任务 |
cron | 配置一个cron表达式,按照表达式的设置执行任务 |
@Component
public class AnalysisJob {
/**
* 应用启动后,等待10000毫秒执行第一次,然后每隔5000毫秒,执行一次本方法
*/
@Scheduled(fixedRate = 5000, initialDelay = 10000)
public void analysis() throws InterruptedException {
System.out.println(new DateTime().toString("yyyy-MM-dd HH:mm:ss.SSS"));
}
}
对于定时任务,我们使用的时候主要是注重两个方面,一个是定时任务的业务,另一个就是Cron表达式。
月份和星期的名称是不区分大小写的,即FRI 和 fri等价。 域之间使用空格分隔
| 名称 | 是否必须 | 允许值 | 特殊字符 |
|---|---|---|---|
| 秒 | 是 | 0-59 | , - * / |
| 分 | 是 | 0-59 | , - * / |
| 时 | 是 | 0-23 | , - * / |
| 日 | 是 | 1-31 | , - * ? / L W C |
| 月 | 是 | 1-12 或 JAN-DEC | , - * / |
| 周 | 是 | 1-7 或 SUN-SAT(1是周日) | , - * ? / L C # |
*星号作用:表示在这个域上包含所有合法的值。
例如在月份域上使用了星号,表示所有月份都会触发
示例:0 * 17 * * ?,表示每月、每天的17:00至17:59分,每分钟都会触发一次
?问号作用:“我不关心这个域上是什么值”,它不同于星号:
注意:只能用在日和周域上,但不能在这两个域上同时使用
不能同时这两个域上指定值的理由是难以解释甚至是难以理解的。
基本上,假定同时指定值的话,意义就会变得含混不清了:考虑一下,如果一个表达式在日域上有值11,同时在周域上指定了 WED。那么是要仅在每个月11号,且正好又是星期三那天被激发?还是在每个星期三的11号被激发呢?要去除这种不明确性的办法就是不能同时在这两个域上指定值。
只要记住,假如你为这两域的其中一个指定了值,那就必须在另一个字值上放一个 ?。
示例:0 10 14 ? 3 3,表示3月每个星期2的14:10:00触发一次
,逗号作用:逗号表示给这个域指定一个值列表,即指定多个值
例如在秒域上使用值0,15,30,45 表示每15秒触发一次
示例:0 0,15,30,45 * * * ? 表示每天都会每15分钟触发一次
/斜杠0/150 0/15 * * * ?表示每天都会每15分钟触发一次-横杠作用:用于指定时间范围。
例如在小时域上指定值8-18,表示8点至18点
注意:范围必须是从小到大,不能回转。即不能写成18-8
示例:0 0 8-18 * * ?表示每天8:00至18:00
#井号6#3表示第3个周五(6在周里表示周五,因为周日是第一天、值是1)2#1表示第1个周一0 0 8 ? 6 1#3 表示每年的6月第3个星期日上午8点(父亲节)L字母0 0 8 L * ?表示每月最后一天的8:00触发0 0 8 ? * 2L表示每月最后一个周一8:00触发W字母0 0 8 2W * ?表示每月 如果2号是工作日,则2号触发;如果2号不是工作日,则找2号最近的工作日触发