SpringBoot使用内置的任务调度定时器

时间:2022-11-09 23:26:18

SpringBoot使用内置的任务调度定时器


在spring-context包中,spring已经包含了scheduling包

如何使用,只需在需要任务调度的方法上加上@Scheduled注解即可,如下


@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);
 }

但是,在查阅了一些资料后发现这个定时器默认是单线程的,也就是说,如果有多个定时器的话,就会存在冲突以及延时,所以这个时候需要给任务调度配置线程池,如下


@Configuration
@EnableScheduling
public class MyScheduleConfig implements SchedulingConfigurer{

 //配置任务调度定时器线程池
 @Override
 public void configureTasks(ScheduledTaskRegistrar task) {
  task.setScheduler(taskExecutor());
 }
 @Bean
 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触发