Spring之定时任务基本使用篇
文章链接: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&公众号
知识星球
Spring之定时任务基本使用篇相关推荐
- Spring定时任务高级使用篇
Spring定时任务高级使用篇 前面一篇博文 <Spring之定时任务基本使用篇> 介绍了Spring环境下,定时任务的简单使用姿势,也留了一些问题,这一篇则希望能针对这些问题给个答案 I ...
- async spring 默认线程池_Spring定时任务高级使用篇
I. 定时任务进阶篇 1. 问题小结 之前写过一篇博文,抛出了下面的几个问题,接下来则围绕问题进行分析 一个项目中有多个定时任务时,他们是并行执行的还是串行执行的? 如果默认是串行的 那么有相同的cr ...
- Spring Boot定时任务应用实践
在Spring Boot中实现定时任务功能,可以通过Spring自带的定时任务调度,也可以通过集成经典开源组件Quartz实现任务调度. 一.Spring定时器 1.cron表达式方式 使用自带的定时 ...
- java实现每天定时执行任务,Spring Task定时任务每天零点执行一次的操作
最近根据项目的需求,需要限制用户每天的发送短信数量.这样以来就需要写一个定时任务,每天去置零一次所有用户的发送短信统计数量. 首先,在application.xml文件中添加 接着就是编写自己的业务处 ...
- 14. Spring Boot定时任务的使用【从零开始学Spring Boot】
[视频 & 交流平台] à SpringBoot视频 http://study.163.com/course/introduction.htm?courseId=1004329008& ...
- Spring task定时任务执行一段时间后莫名其妙停止的问题
前因: 我写了一个小项目,主要功能是用Spring task定时任务每天定时给用户发送邮件.执行了几个月一直没有问题,前几天,莫名其妙的突然不再发送邮件了. 只好花费一些时间来查看到底是什么原因造成的 ...
- Java Spring @Scheduled 定时任务crontab表达式设置
Java Spring @Scheduled 定时任务crontab表达式设置 1. Cron详解 2. 例子 参考 1. Cron详解 Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或 ...
- spring之旅第四篇-注解配置详解
spring之旅第四篇-注解配置详解 一.引言 最近因为找工作,导致很长时间没有更新,找工作的时候你会明白浪费的时间后面都是要还的,现在的每一点努力,将来也会给你回报的,但行好事,莫问前程!努力总不会 ...
- Spring思维导图,让Spring不再难懂(aop篇)
2019独角兽企业重金招聘Python工程师标准>>> 什么是aop AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Or ...
最新文章
- Linux软件的安装,更新与卸载
- 如何写一篇不水的机器学习论文?这17页指南从建模、评估到写报告,手把手教你...
- Flask服务部署与简单内网穿透
- pillow python 划线_Python-PIL(pillow)图片处理入门(一)
- 用html编写你好,02 - HTML5第一个项目:HelloWorld!(收藏)
- 无监督学习︱GAN 在 NLP 中遇到瓶颈+稀疏编码自学习+对偶学习
- 升级总代分享思路_定档了!升级了!1月23日《我家那闺女》第二季要给你“好看”...
- windows 安装apex_《Apex英雄》:如何在你的PC上下载安装玩到它
- word标题大纲级别_word中级别设置 如何快速设置word大纲级别?
- 012Java虚拟机005垃圾的回收
- ZZULIOJ:1044: 不及格率
- 世预赛国足0-1日本遭遇两连败,接下来对阵越南会做出怎样调整?
- Matlab函数psf2otf()的python实现
- D3D9学习笔记之颜色
- win10商店打不开解决办法
- 民间秘方,里面的方子都是一个老中医几十年的心血哦。(感觉不错就摘过来了)
- 彻底删除已经下载安装好的Mysql
- GLView基本分析
- Linux | 可重入函数 | volatile | SIGCHLD信号
- 关于要走的游戏之路,一点点小心思
热门文章
- Google 发布 Cloud AutoML 降低机器学习门槛,调参民工前景堪忧
- 好家伙!JDK16 GA 终于发布,内置 Lombok 的功能,真的顶?
- 切记!MySQL中ORDER BY与LIMIT 不要一起用,有大坑
- 为什么像王者荣耀这样的游戏 Server 不愿意使用微服务?
- 刚出炉的一套面试题(JAVA岗)
- kong api gateway 初体验
- 麻省理工开放官方课程项目!
- 深入浅出统计学(十四)卡方分布
- 收藏 | 图解Transformer:Attention Is All You Need
- Google 确认 Chrome 存在严重漏洞,向 20 亿用户发出警告:你们需立即更新浏览器...