Java Spring定时任务, @Scheduled常用参数
简单代码实例
开启定时任务
package com.test.web.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
@EnableScheduling
@Configuration
public class ScheduleConfig {
}
定时任务触发方法 1
- 项目启动后每5秒执行的实例
@Component
public class ScheduleController {
@Scheduled(fixedDelay=5_000)
public void doInterval() {
/**
* 一般考虑到多个独立服务器分布式部署, 此处会加分布式锁
* */
try {
System.out.println("定时处理开始: " + LocalDateTime.now());
} catch (Exception e) {
System.out.println("定时处理异常: " + e.getMessage());
} finally {
System.out.println("定时处理结束: " + LocalDateTime.now());
}
}
}
Spring定时任务有两种配置方式 注解方式, Xml方式
本文讲解 @Scheduled的几个常用参数
- cron:一个类似linux crontab的表达式, 有7个元素组成(年元素可以省略, 省略了默认是每一年)
- zone:cron表达式的时区
- fixedDelay:在上一次调用结束和下一次调用开始之间以固定周期(单位为毫秒). 等待上次任务完成后
- fixedRate:在调用之间以固定的周期(单位为毫秒). 不等待上次任务完成
- initialDelay:第一次执行 fixedRate, fixedDelay任务之前延迟的毫秒数
- 注意事项
@Scheduled只能用于无参方法上
cron, fixedDelay, fixedRate中只能同时存在一个, cron可以定义复杂任务, fixedDelay和 fixedRate只能定义简单任务
cron元素说明:
序号 | 说明 | 必填 | 允许填写的值 | 允许的特殊字符 |
---|---|---|---|---|
1 | 秒 | 是 | 0~59 | ,*-/ |
2 | 分 | 是 | 0~59 | ,*-/ |
3 | 小时 | 是 | 0~23 | ,*-/ |
4 | 日 | 是 | 0~31 | ,-*?/LWC |
5 | 月 | 是 | 1-12 | ,*-/ |
6 | 周 | 是 | 1-7 or SUN/MON/TUE/WED/THU/FRI/SAT 例 SUN = 1 | ,-*?/LC# |
7 | 年 | 否 | 1970-2099 | ,*-/ |
通配符说明:
- “*” 表示所有值, 表示每一分钟都会触发
- “?” 表示不指定值, 使用的场景为不需要关心当前字段. 例: 要每月的10号触发, 不关心是周几 0 0 0 10 * ?
- “-” 表示区间, 例: "10-12"表示 10,11,12
- “,” 表示指定多个值, 例: 周字段设置 "MON,WED,FRI"表示周一,周三和周五触发
- “/” 用于递增触发, 例: 秒字段设置 "5/15"表示从5秒开始每增15秒触发(5,20,35,50), 月字段设置 "1/3"表示每月1号开始每隔三天触发一次
- “L” 表示最后,
- 日字段设置表示当月的最后一天.
- 周字段表示星期六 “7”, “SAT”.
- "L"前加上数字则表示该数据的最后一个, 例: 周字段设置 "6L"表示本月最后一个星期五.
- “W” 表示离指定日期的最近那个工作日(周一至周五). 例: 日字段设置 “15W”, 表示离每月15号最近的那个工作日触发. 如果15号正好是周六则找最近的周五(14号)触发, 如果15号是周未则找最近的下周一(16号)触发. 如果15号正好在工作日(周一至周五)则就在该天触发. 如果设置 "1W"则表示每月1号往后最近的工作日触发. 如果1号正是周六则将在3号下周一触发 (注 "W"前只允许设置具体的数字, 不允许区间 “-”).
- “#” 序号(表示每月的第几个周几), 例: 周字段设置 "6#3"表示在每月的第三个周六. 注 如果指定 "#5"正好第五周没有周六则不会触发. 'L’和 'W’可以一组合使用, 如果在日字段上设置 "LW"则表示在本月的最后一个工作日触发, 周字段的设置若使用英文字母是不区分大小写的即 MON与 mon相同.
cron常用案例
*/1 * * * * ? 每隔1秒执行一次
0 */1 * * * ? 每隔1分钟执行一次
0 0 14 * * ? 每天14点执行一次
0 0 6 ? * L 每周星期天凌晨6点执行一次
0 0 6 1 * ? 每月1号凌晨6点执行一次
0 0 20 L * ? 每月最后一天20点执行一次
0 0,2,9,16 * * * ? 0分,2分,9分,16分执行一次
0 0 0,23 * * ? 每天的0点,23点都执行一次
0 0/5 9-18 * * ? 朝9晚6时间内每5分钟执行
0 0 12 ? * WED 每个周三中午12点执行
0 15 10 ? * * 每天上午10:15执行(必须日或周中有一个设置为"?")
0 15 10 * * ? 每天上午10:15执行(必须日或周中有一个设置为"?")
0 15 10 * * ? * 每天上午10:15执行(必须日或周中有一个设置为"?")
0 15 10 * * ? 2019 2019年的每天上午10:15执行
0 * 14 * * ? 每天下午2点到下午2:59期间的每1分钟执行
0 0/5 14 * * ? 每天下午2点到下午2:55期间的每5分钟执行
0 0/5 14,18 * * ? 每天下午2点到2:55期间和下午6点到6:55期间的每5分钟执行
0 0-5 14 * * ? 每天下午2点到下午2:05期间的每1分钟执行
0 10,44 14 ? 3 WED 每年三月的周三的下午2:10和2:44执行
0 15 10 ? * MON-WED 周一至周三的上午10:15执行
0 15 10 12 * ? 每月12日上午10:15执行
0 15 10 L * ? 每月最后一日的上午10:15执行
0 15 10 ? * 6L 每月的最后一个周五上午10:15执行
0 15 10 ? * 6L 2018-2019 2018年至2019年的每月的最后一个周五上午10:15执行
0 15 10 ? * 6#3 每月的第三个周五上午10:15执行
定时任务触发方法 2
- 项目启动后每分钟00秒执行的实例
@Component
public class ScheduleController {
@Scheduled(cron="0 0/1 * * * ?")
public void doInterval() {
/**
* 一般考虑到多个独立服务器分布式部署, 此处会加分布式锁
* */
try {
System.out.println("定时处理开始: " + LocalDateTime.now());
} catch (Exception e) {
System.out.println("定时处理异常: " + e.getMessage());
} finally {
System.out.println("定时处理结束: " + LocalDateTime.now());
}
}
}
如果您觉得有帮助,欢迎点赞哦 ~ 谢谢!!