spring定时任务学习总结

写在前面:工作中接到了和定时任务有关的内容,之前只对定时任务有所了解,也没写过定时任务相关的代码,好在只是在原有的任务上进行逻辑的修改。
(强迫症的我没完全搞清楚spring定时任务就有种难受的感觉)现在回过头来系统学习一波spring定时任务

Spring定时任务

springboot中使用

1. 在启动类上加@EnableScheduling开启定时任务注解
2.方法上加@Scheduled(fixeRate = 30*60*1000)注解设置执行间隔30分钟执行一次
(启动的时候就会执行一次)

使用cron表达式设置执行时间

@Scheduled(cron = "0 0/30 9-22 * * ?")  9点整执行一次然后,9-22点每隔30分钟执行一次

cron表达式讲解:

形式 * * * * * * *spring不支持
字段 Seconds Minutes Hours DayofMonth Month DayofWeek Year
含义 星期 年(可选)
范围 0-59 0-59 0-23 1-31 1-12
符号 ,-*/ ,-*/ ,-*/ ,-*/?LWC ,-*/ ,-*/?LC#

日期和星期是冲突的一个要为 ?

通用符号:,-*/

,  表示列出枚举值,例如在Minutes域使用5,20,表示在5分钟和20分钟时候触发事件

- 表示范围,例如在Minutes域使用5-20,表示在分钟数为5-20时候的每分钟触发事件,后面的秒什么的也要设置。

* 表示匹配该区域的任意值,如果在分钟设置,那么就是每分钟触发事件

/ 表示时间开始触发,然后每隔固定时间触发一次,比如Minutes域使用5/20表示时间的分钟数为5时触发一次,后隔20分钟即25,45触发一次事件。不超过60,下次循环就是从5开始的

练习题目

0 0 2 1 * ? *
每个月的第一天凌晨2点整执行一次
0 10,20 12 ? 3 wed
3月的星期4的12点的10和20分钟执行
注意spring不支持7位,年,

专有符号:

?:只能在日期或者星期俩个域设置,因为这俩个域是互斥的,所以必须有一个域设置?
L:表示最后,只能出现在日期或者星期域,如果在星期上用5L表示最后一个星期四触发,5表示星期四,L最后。
W:表示有效工作日(周一到周五),只能出现在日期域,系统会在离指定日期最近的工作日触发事件,
5w表示每月5号最近的工作日触发
LW:可以连用表示某个月的最后一个工作日
#:只能用于用于星期域,用于确定每个月的第几个星期几,例如5#2表示每个月的第二个星期四 
C:用于日期和星期域,需要关联日历,如果没关联可以忽略。

注意:

Spring中除了?,其他都不支持,(学了个屁。。。)


异步多线程实现

Spring中定时任务是单线程的,如果定时任务执行事件比较长,那么就有可能丢失定时任务那么如何解决呢?spring为我们提供了异步多线程的定时任务。

俩步实现:
1.开启异步注解
启动类多加一个注解:@EnableAsync
2.设置异步执行
方法上多加:@Async注解
这样就实现了异步多线程的定时任务。。。 
在线生成cron表达式地址:http://cron.qqe2.com

你可能感兴趣的:(笔记)