Spring之定时任务基本使用篇
Spring之定时任务基本使用篇
Spring之定时任务基本使用篇spring-boot项目中,想添加一个定时任务,可以怎么办?不管什么项目,都是可以直接用JDK原生的定时任务来实现借助@Scheduled注解来使用本篇博文则主要集中在在SpringBoot项目中,怎么使用定时任务I. 基本使用1. demo在SpringBoot项目中,使用定时任务需要先开启对应的配置,一个简单的demo如下代码
Spring之定时任务基本使用篇
Spring之定时任务基本使用篇
spring-boot项目中,想添加一个定时任务,可以怎么办?
- 不管什么项目,都是可以直接用JDK原生的定时任务来实现
- 借助
@Scheduled
注解来使用
本篇博文则主要集中在在SpringBoot项目中,怎么使用定时任务
1. demo
在SpringBoot项目中,使用定时任务需要先开启对应的配置,一个简单的demo如下
代码语言:javascript代码运行次数:0运行复制 代码解读复制代码@EnableScheduling
@SpringBootApplication
public class QuickMediaApplication {
public static void main(String[] args) {
SpringApplication.run(, args);
}
@Scheduled(cron = "0/1 * * * * ?")
public void sc1() throws InterruptedException {
println(().getame() + " | sc1 " + ());
}
}
上面的代码足够简单,基本上没有什么好额外解释的,只是注意下要使用定时任务,必须加上 @EnableScheduling
注解
2. cron表达式
另外一个有意思的就是@Scheduled
注解中的cron是怎么定义的,上面那个是啥意思?
Cron定义如下
代码语言:javascript代码运行次数:0运行复制 代码解读复制代码Seconds Minutes Hours DayofMonth Month DayofWeek Year
Seconds Minutes Hours DayofMonth Month DayofWeek
上面每个坑位,可以取得值不一样,先分别说明几个可能见到的符号
*
: 表示匹配该域的任意值,如分钟的坑位为*
, 表示每分钟都会触发?
: 只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会。因为DayofMonth和 DayofWeek会相互影响。例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法:1 1 15 20 ?
-
: 表示范围,例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次。/
: 表示起始时间开始触发,然后每隔固定时间触发一次- 如在Minutes域使用5/20,则意味着5分钟触发一次,而25,45等分别触发一次
,
: 表示列出枚举值值。- 如:在Minutes域使用5,20,则意味着在5和20分每分钟触发一次。
L
: 表示最后,只能出现在DayofWeek和DayofMonth域,- 如在DayofWeek域使用5L,意味着在最后的一个星期四触发。
W
: 表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件- 如:在 DayofMonth使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5星期一 到星期五中的一天,则就在5日触发。另外一点,W的最近寻不会跨过月份。
LW
: 这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。#
: 用于确定每个月第几个星期几,只能出现在DayofMonth域。例如在4#2,表示某月的第二个星期三。
根据上面的说明,前面的crond表达式含义就比较清楚了
代码语言:javascript代码运行次数:0运行复制 代码解读复制代码0/1 * * * * ?
每s种执行一次
. 实例说明
下面给出一些常见的实例说明
代码语言:javascript代码运行次数:0运行复制 代码解读复制代码0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
0 0/0 9-17 * * ? 朝九晚五工作时间内每半小时
0 0 12 ? * WED 表示每个星期三中午12点
"0 0 12 * * ?" 每天中午12点触发
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005年的每天上午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 ? WED" 每年三月的星期三的下午2:10和2:44触发
"0 15 10 ? * MO-FRI" 周一至周五的上午10:15触发
"0 15 10 15 * ?" 每月15日上午10:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#" 每月的第三个星期五上午10:15触发
4. 疑问
上面只是介绍了简单的使用姿势,但有几个自然而然的疑问有待验证
- 一个项目中有多个定时任务时,他们是并行执行的还是串行执行的?
- 如果默认是串行的
- 那么有相同的crond表达式的定时任务之间,有先后顺序么?
- 某个任务的阻塞是否会影响后面的任务?
- 如果需要他们并行执行,可以怎么做?
- 如果是并发执行的
- 是新创建线程还是采用线程池来复用呢?
- 在并发执行时,假设有个每秒执行一次的任务,但是它执行一次消耗的时间大于1s时,这个任务的表现时怎样的呢?不断地新增线程来执行还是等执行完毕之后再执行下一次的呢?
上面这些问题先跑出来,留待下次结合实例给出回答
#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
上传时间: 2025-07-20 16:40:52
上一篇:跨域的解决方式(java后端)
推荐阅读
留言与评论(共有 13 条评论) |
本站网友 吃饭皇帝大 | 18分钟前 发表 |
如果5日是星期天 | |
本站网友 静安区 | 5分钟前 发表 |
前面的crond表达式含义就比较清楚了代码语言:javascript代码运行次数:0运行复制 代码解读复制代码0/1 * * * * ? 每s种执行一次. 实例说明下面给出一些常见的实例说明代码语言:javascript代码运行次数:0运行复制 代码解读复制代码0 0 10 | |
本站网友 武汉舰 | 26分钟前 发表 |
它也匹配域的任意值 | |
本站网友 orr | 17分钟前 发表 |
10和2 | |
本站网友 神龙谷 | 26分钟前 发表 |
然后每隔固定时间触发一次 如在Minutes域使用5/20 | |
本站网友 衣服上的油渍怎么洗 | 30分钟前 发表 |
15触发 "0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10 | |
本站网友 易联盟 | 30分钟前 发表 |
15触发 "0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10 | |
本站网友 李大卫 | 6分钟前 发表 |
15触发 "0 15 10 * * ? 2005" 2005年的每天上午10 | |
本站网友 莫道明 | 10分钟前 发表 |
前面的crond表达式含义就比较清楚了代码语言:javascript代码运行次数:0运行复制 代码解读复制代码0/1 * * * * ? 每s种执行一次. 实例说明下面给出一些常见的实例说明代码语言:javascript代码运行次数:0运行复制 代码解读复制代码0 0 10 | |
本站网友 fieldset | 24分钟前 发表 |
用于确定每个月第几个星期几 | |
本站网友 李侃桢 | 6分钟前 发表 |
表示起始时间开始触发 | |
本站网友 黄河网 | 5分钟前 发表 |
先分别说明几个可能见到的符号* |