Spring之定时任务基本使用篇

news/2024/7/17 21:31:35

image.png

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

Spring之定时任务基本使用篇

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

  • 不管什么项目,都是可以直接用JDK原生的定时任务来实现
  • 借助@Scheduled注解来使用

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

<!-- more -->

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&公众号

QrCode

知识星球

zhishi


http://lihuaxi.xjx100.cn/news/271737.html

相关文章

python的难点在哪里_自己写的Python答案,不知道错在哪儿希望能被告知问题在哪儿和答案...

问题&#xff1a;输入一个邮箱&#xff0c;来判定该邮箱的格式是否正确。类似AB.C的结构&#xff0c;A,B,C都必须至少包含一个字母或者数字。例子&#xff1a;nig.com格式正确的话输出&#xff1a;(ig.com &#xff0c;True)例子&#xff1a;n_ig.com不正确的话输出&#xff1a…

MySql存储引擎特性对比

下表显示了各种存储引擎的特性&#xff1a; 其中最常见的两种存储引擎是MyISAM和InnoDB 刚接触MySQL的时候可能会有些惊讶&#xff0c;竟然有不支持事务的存储引擎&#xff0c;学过关系型数据库理论的人都知道&#xff0c;事务是关系型数据库的核心。但是在现实应用中&#xff…

华人博士生首次尝试用两个Transformer构建一个GAN

选自arXiv作者&#xff1a;Yifan Jiang等机器之心编译机器之心编辑部「attention is really becoming『all you need』.」最近&#xff0c;CV 研究者对 transformer 产生了极大的兴趣并取得了不少突破。这表明&#xff0c;transformer 有可能成为计算机视觉任务&#xff08;如分…

mysql为什么每天0点就装东西_MySQL的详细安装教程

1、安装之前需要注意的几点建议不要安装最新版本&#xff0c;一般找mysql5.0系列版本即可&#xff1b;mysq1官网有.zip和.msi两种安装形式&#xff1b;zip是压缩包&#xff0c;直接解压缩以后使用的&#xff0c;需要自己配置各种东西&#xff1b;msi是安装包&#xff0c;系统直…

机器视觉检测中的图像预处理方法

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达本文以Dalsa sherlock软件为例&#xff0c;一起来了解一下视觉检测中平滑模糊的图像处理方法。1.观察灰度分布来描述一幅图像称为空间域&#xff0c;观察图像变化的频率被…

乔姆斯基专访:深度学习并没有探寻世界本质

来源 | 数据派 THU乔姆斯基是一位开创性的人物&#xff0c;尤其是他那本 《句法结构 》被认为是20世纪理论语言学研究上最伟大的贡献。不光《句法结构》&#xff0c;还有 《现代希伯莱语语素音位学》、《转换分析》等一系列语言学著作传达了对多种正规语言的洞见&#xff0c;也…

Lucene.Net无障碍学习和使用:索引篇

项目中可能需要再次用到Lucene.Net&#xff0c;利用空闲时间写了个demo&#xff0c;主要涉及到索引的创建、删除、更新和一个简单查询。在本文示例中&#xff0c;Lucene.Net的版本是2.4.0&#xff0c;某些类和方法与最新版本或者较旧的版本有较多不同&#xff0c;希望您阅读顺利…

开源一个天气APP Build with React Native

About Github 断断续续花了几天的时间&#xff0c;利用网上开放的小米天气接口&#xff0c;基于React native 写了一个天气APP。App store 在审核中。设计能力有限&#xff0c;天气动画只加了两个&#xff0c;AE导出JSON&#xff0c;然后使用lottie展示动画。 Build with React…