定时任务在开发中需要用到的频率是相对来说比较高的, 很多业务的处理需要用到定时任务, 例如定时扫描数据库, 定时发送消息到消息队列等等; Spring提供了定时任务机制供开发使用, 以下是对定时任务的一点总结, 方便后续工作中遇到类似的需求的时候的资料查阅;
Spring 从3.0之后提供SpringTask实现了任务调度, 支持非常灵活, 支持按日历调度, 相比Quartz功能稍简单, 但是在开发过程中可以说基本上都够用, 也支持注解编程方式; SpringTask主要有两种任务的执行方式, 分别是SpringTask串行, SpringTask并行.
1,编写任务类, 如果是SpringBoot项目, 需要在工程的启动类上添加上@EnableScheduling, 该注解的意思是开启Spring定时任务支持; 新建任务类testTask如下:
@Scheduled(fixedRate = 5000) //上次执行开始时间后五秒执行
@Scheduled(fixedDelay = 5000) //上次执行完毕后五秒执行
@Scheduled(initialDelay=3000, fixedRate=5000) //第一次延迟3秒, 以后每隔五秒执行一次
@Scheduled(cron="0/3 * * * * *") //每隔三秒执行一次
到这就要说下cron表达式了, 它表达了定时任务的时间控制机制, 这也是最容易忘却的地方, 在此坐下大致说明:
cron 表达式包括6部分(对应代码中的cron表达式):@Scheduled(cron="0/3 * * * * *")
秒(0~59) 分钟(0~59) 小时(0~23) 月中的天(1~31) 月(1~12) 周中的天
(填写MON,TUE,WED,THU,FRI,SAT,SUN,或数字1~7 1表示MON,依次类推)
特殊字符介绍:
“/”字符表示指定数值的增量
“*”字符表示所有可能的值
“-”字符表示区间范围
"," 字符表示列举
“?”字符仅被用于月中的天和周中的天两个子表达式,表示不指定值
例子:
0/3 * * * * * 每隔3秒执行
0 0/5 * * * * 每隔5分钟执行
0 0 0 * * * 表示每天0点执行
0 0 12 ? * WEN 每周三12点执行
0 15 10 ? * MON-FRI 每月的周一到周五10点 15分执行
0 15 10 ? * MON,FRI 每月的周一和周五10点 15分执行
经过测试发现, 两个串行任务是由一个线程执行, task方法执行完后task2再执行;