SpingBoot @Scheduled定时任务
现在有每天抽数据,统计数据的需求,虽然说我有点理解不了 记录 每个部门 的 销售评审流程 的 平均处理时长 这个数据有什么意义。码农?malou!
SpringBoot 从1.3.0
版本开始提供对定时任务的支持
准备工作
1、在启动类上添加@EnableScheduling开启定时任务
2、在定时任务上添加@Scheduled(所在的类上添加@Component)
3、写cron表达式或者配置fixedRate/fixedDelay属性
cron表达式
SpringBoot只支持6位的cron表达式,不支持7位(没有Year/年)
SpringBoot只支持cron表达式中的专有符号?,其他的反正用不到就不写了,cron表达式在线生成工具
* | * | * | * | * | * | * | |
---|---|---|---|---|---|---|---|
字段 | Seconds | Minutes | Hours | DayofMonth | Month | DayofWeek | Year |
含义 | 秒 | 分 | 时 | 日 | 月 | 星期 | 年 |
符号 | , - * / | , - * / | , - * / | , - * / ? | , - * / | , - * / | , - * / ? |
符号解析:
,
:枚举
eg:Seconds中1,5
,表示在第1秒,第5秒的时候触发事件
-
:范围
eg:Seconds中1-5
,表示在1秒到5秒,这个区间内每秒都触发事件
*
:通配符
eg:Seconds中使用,表示每一秒都触发事件
/
:间隔
eg:Seconds中1/5
,表示第1秒触发一次,后隔5秒触发一次事件
?
:不指定值
只能用在DayofMonth
和DayofWeek
两个域,两者互斥,须对其一设置
fixedRate
@Schedule中的属性,用于指定任务执行的时间间隔(单位为毫秒),表示以固定的频率执行某个方法或任务
eg:如果设置为1s,任务将每隔1s执行一次,每次任务执行开始后等待1s再执行下一次
fixedRate从上一次方法执行开始的时间算起,如果上一次方法执行时间超过了间隔时间,那上一次任务执行完之后,立即执行下一个任务
fixedDelay
@Schedule中的属性,用于指定任务执行之间的延迟时间(单位为毫秒),表示以固定的时间间隔执行某个方法或任务,并在每次执行完成后等待指定的延迟时间再执行下一次
eg:如果设置为1s,任务将每隔1s执行一次,每次任务执行完成后等待1s再执行下一次
fixedDelay从上一次方法执行完成的时间算起,如果上一次方法执行阻塞住了,会等到上一次方法执行完,并等待给定间隔时间之后执行下一次
开启异步来执行定时任务
1、在启动类上添加注解@EnableAsync
2、定时任务上添加@Async
开启异步后,每个任务都会从线程池里分配一个线程来执行,避免耗时长的任务影响到其他任务