在spring-context包中,spring已经包含了scheduling包
如何使用,只需在需要任务调度的方法上加上@Scheduled注解即可,如下
cron="10 * * * * ?") ( public void sc(){ Date date = new Date(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); String format = simpleDateFormat.format(date); System.out.println(format); }
但是,在查阅了一些资料后发现这个定时器默认是单线程的,也就是说,如果有多个定时器的话,就会存在冲突以及延时,所以这个时候需要给任务调度配置线程池,如下
public class MyScheduleConfig implements SchedulingConfigurer{ //配置任务调度定时器线程池 public void configureTasks(ScheduledTaskRegistrar task) { task.setScheduler(taskExecutor()); } public Executor taskExecutor(){ return Executors.newScheduledThreadPool(5); } }
最后,附上cron部分正则语法
Cron表达式由6~7个由空格分隔的时间元素组成。第7个元素可选,而表达式的每个字段,都可以显式地规定一个值(如49)、一个范围(如1-6)、一个列表(如1,3,5)或者一个通配符(如*),如下表:
位置 | 字段含义 | 范围 | 允许的特殊字符 |
---|---|---|---|
1 | 秒 | 0~59 | * / |
2 | 分钟 | 0~59 | * / |
3 | 小时 | 0~23 | * / |
4 | 月份中的哪一天 | 1~31 | * / ? L |
5 | 月份 | 1~12 或 JAN~DEC | * / |
6 | 星期几 | 1~7 或 SUN~SAT | * / ? L # |
7 | 年份 | 1970~2099 | * / |
Cron表达式有几个特殊的字符,说明如下:
“ - ”:中划线,表示一个范围
“ , ”:使用逗号间隔的数据,表示一个列表
“ * ”:表示每一个值,它可以用于所有字段。例如:在小时字段表示每小时
“ ? ”:该字符仅用于“月份中的哪一天”字段和“星期几”字段,表示不指定值。当这两个字段其中之一被指定了值之后,为了避免冲突,需要将另外一个字段的值设为“?”
“ / ”:通常表示为x/y,x为起始值,y表示值的增量,如0/3表示从0开始,每三个单位执行一次。
“ L ”:表示最后一天,仅在日期和星期字段中使用,但是在两个字段中表示的含义不同。L在“月份中的哪一天”字段中,表示一个月的最后一天。L在“星期几”字段中,表示一个星期的最后一天,也就是SAT(或者数字7)。例如:“0 0 14 ? * L”表示每个月的最后一个星期的星期六下午14:00执行。另外,在“星期几”字段上,你可以用一个数字和L连用,表示月份的最后一个星期X。例如:表达式“0 0 0 ? * 2L”中“2L”指每个月的最后一个星期一触发。需要注意的是,如果使用L时,不要指定列表或范围,否则会导致错误
“ # ”:只能用于“星期几”字段,表示这个月的第几个周几。例如:“6#3”指这个月第三个周五
Cron表达式示例:
Cron表达式 | 含义 |
---|---|
0 0 8-12 ? * MON-FRI | 每个工作日的8点到12点 |
0 15 4 * * ? | 每天凌晨4点15分 |
30 0 0 1 1 ? 2014 | 2014年1月1日凌晨过30秒 |
0 0 14 1,10,20 * ? * | 每月的1号、10号、20号的下午2点 |
0 0 17 L * ? | 每月最后一天17:00运行 |
0 0 10 ? * 6L | 每月最后一个星期五10:00运行 |
0 0/5 15,17 * * ? | 每天15点到16点每5分钟运行一次, 此外,每天17点到18点每5分钟运行一次 |
0 30 10 ? * 6#3 2013 | 2013年每月的第三个星期五上午10:30触发 |