资讯专栏INFORMATION COLUMN

Spring之定时任务基本使用篇

Jingbin_ / 2826人阅读

摘要:表示起始时间开始触发,然后每隔固定时间触发一次如在域使用则意味着分钟触发一次,而,等分别触发一次表示列出枚举值值。

文章链接:https://liuyueyi.github.io/hexblog/2018/08/01/180801-Spring之定时任务基本使用篇/

Spring之定时任务基本使用篇

spring-boot项目中,想添加一个定时任务,可以怎么办?

不管什么项目,都是可以直接用JDK原生的定时任务来实现

借助@Scheduled注解来使用

本篇博文则主要集中在在SpringBoot项目中,怎么使用定时任务

I. 基本使用 1. demo

在SpringBoot项目中,使用定时任务需要先开启对应的配置,一个简单的demo如下

@EnableScheduling
@SpringBootApplication
public class QuickMediaApplication {

    public static void main(String[] args) {
        SpringApplication.run(QuickMediaApplication.class, args);
    }

    @Scheduled(cron = "0/1 * * * * ?")
    public void sc1() throws InterruptedException {
        System.out.println(Thread.currentThread().getName() + " | sc1 " + System.currentTimeMillis());
    }
}

上面的代码足够简单,基本上没有什么好额外解释的,只是注意下要使用定时任务,必须加上 @EnableScheduling注解

2. cron表达式

另外一个有意思的就是@Scheduled注解中的cron是怎么定义的,上面那个是啥意思?

Cron定义如下

Seconds Minutes Hours DayofMonth Month DayofWeek Year
Seconds Minutes Hours DayofMonth Month DayofWeek

上面每个坑位,可以取得值不一样,先分别说明几个可能见到的符号

* : 表示匹配该域的任意值,如分钟的坑位为*, 表示每分钟都会触发

? : 只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会。因为DayofMonth和 DayofWeek会相互影响。例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法: 13 13 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表达式含义就比较清楚了

0/1 * * * * ?
每s种执行一次
3. 实例说明

下面给出一些常见的实例说明

0 0 10,14,16 * * ? 每天上午10点,下午2点,4点 
0 0/30 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 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发 
"0 15 10 ? * MON-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#3" 每月的第三个星期五上午10:15触发
4. 疑问

上面只是介绍了简单的使用姿势,但有几个自然而然的疑问有待验证

一个项目中有多个定时任务时,他们是并行执行的还是串行执行的?

如果默认是串行的

那么有相同的crond表达式的定时任务之间,有先后顺序么?

某个任务的阻塞是否会影响后面的任务?

如果需要他们并行执行,可以怎么做?

如果是并发执行的

是新创建线程还是采用线程池来复用呢?

在并发执行时,假设有个每秒执行一次的任务,但是它执行一次消耗的时间大于1s时,这个任务的表现时怎样的呢?不断地新增线程来执行还是等执行完毕之后再执行下一次的呢?

上面这些问题先跑出来,留待下次结合实例给出回答

II. 其他 1. 一灰灰Blog: https://liuyueyi.github.io/he...

一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

2. 声明

尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

微博地址: 小灰灰Blog

QQ: 一灰灰/3302797840

3. 扫描关注

一灰灰blog

小灰灰Blog&公众号

知识星球

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/76571.html

相关文章

  • Spring定时任务高级使用

    摘要:定时任务高级使用篇前面一篇博文之定时任务基本使用篇介绍了环境下,定时任务的简单使用姿势,也留了一些问题,这一篇则希望能针对这些问题给个答案定时任务进阶篇问题小结前面一篇博文,抛出了下面的几个问题,接下来则围绕问题进行分析一个项目中有多个定时 showImg(https://segmentfault.com/img/remote/1460000015880327); Spring定时任务...

    dcr309duan 评论0 收藏0
  • Spring 定时任务

    摘要:在定时器接口的方法中我们可以发现一个方法接受接口,而也是一个接口,抽象了触发任务执行的触发器。更常用的一个触发器是,它使用表达式指定何时执行任务。配置定时任务首先看看配置。配置提供了命名空间,让配置定时任务非常简单。 本文参考自Spring官方文档 34. Task Execution and Scheduling。 在程序中常常有定时任务的需求,例如每隔一周生成一次报表、每个月月末清...

    justCoding 评论0 收藏0
  • 180719-Quick-Task 动态脚本支持框架使用介绍

    摘要:文章链接动态脚本支持框架之使用介绍篇动态脚本支持框架之使用介绍篇相关博文动态脚本支持框架整体介绍篇这个项目主要就是为了解决数据订正和接口验证不方便的场景,设计的一个及其简单的动态脚本调度框架,前面一篇整体介绍篇博文,主要介绍了这是 showImg(https://segmentfault.com/img/remote/1460000015698572); 文章链接:https://li...

    shiina 评论0 收藏0
  • Java深入-框架技巧

    摘要:从使用到原理学习线程池关于线程池的使用,及原理分析分析角度新颖面向切面编程的基本用法基于注解的实现在软件开发中,分散于应用中多出的功能被称为横切关注点如事务安全缓存等。 Java 程序媛手把手教你设计模式中的撩妹神技 -- 上篇 遇一人白首,择一城终老,是多么美好的人生境界,她和他历经风雨慢慢变老,回首走过的点点滴滴,依然清楚的记得当初爱情萌芽的模样…… Java 进阶面试问题列表 -...

    chengtao1633 评论0 收藏0
  • Java深入-框架技巧

    摘要:从使用到原理学习线程池关于线程池的使用,及原理分析分析角度新颖面向切面编程的基本用法基于注解的实现在软件开发中,分散于应用中多出的功能被称为横切关注点如事务安全缓存等。 Java 程序媛手把手教你设计模式中的撩妹神技 -- 上篇 遇一人白首,择一城终老,是多么美好的人生境界,她和他历经风雨慢慢变老,回首走过的点点滴滴,依然清楚的记得当初爱情萌芽的模样…… Java 进阶面试问题列表 -...

    dance 评论0 收藏0

发表评论

0条评论

Jingbin_

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<