一、如何使用
- 编写定时任务类,加入IOC,一般使用@Component注解。
- 在定时任务方法上使用@Scheduled注解,使用cron表达式标明运行时间设置,或使用fixedRate和fixedDelay
- 在Springboot启动类上加@EnableScheduling注解开启定时任务。
二、说明
cron表达式:
格式:
{秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)}
特殊字符意义:
下面的单位以秒为例:
“*” 代表每隔1单位触发
“,” 代表在指定的单位触发,比如"10,20,30"代表10秒、20秒和30秒时触发任务
“-” 代表在指定的范围内触发,比如"5-10"代表从5秒开始触发到10秒结束触 发,每隔1秒触发
“/” 代表触发步进,"/“前面的值代表初始值(”“等同"0”),后面的值代表偏移量,比如"0/25"或者"/25"代表从0秒开始,每隔25秒触发1次,"10-45/20"代表在[10,45]内步进20秒命中的时间点触发,即10秒触发1次,30秒触发1次。
fixedRate和fixedDelay
1)fixedDelay设置的是:上一个任务结束后多久执行下一个任务;
2)fixedRate设置的是:上一个任务的开始到下一个任务开始时间的间隔;
三、定时任务介绍
java三种定时任务:
-
Timer :存在缺陷:建议使用ScheduledThreadExecutor代替。
- 基于绝对时间,如系统时钟改变会出现问题。
- 只会创建单线程执行任务,如果一个任务执行时间过长,超过下次开始时间,会导致任务丢失或执行时间不准确。
- 如果TimerTask抛出未检查的异常,Timer将会产生无法预料的行为。Timer线程并不捕获异常,所以TimerTask抛出的未检查的异常会终止timer线程。其余任务无法执行。
-
ScheduledThreadExecutor 基于相对时间,定时任务线程池。
-
spring schedule 默认单线程,可以配置多线程。
<task:scheduler id="dataScheduler" pool-size="5"/>
-
quartz :企业级,功能强大。支持集群,可随时修改。
可参考:Spring Boot Quartz 使用介绍