定时任务调度springTask和cron表达式

简介: 定时任务调度springTask和cron表达式

一、常用的任务调度框架和区别


常用框架


在企业级应用中,经常会制定一些“计划任务”,即在某个时间点做某件事情,核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作。常见的任务调度框架有Quartz和SpringTask等。


区别


1、相同点:


两者均能实现定时调度任务


2、Quartz


① 默认多线程异步执行


② 单个任务时,在上一个调度未完成时,下一个调度时间到时,会另起一个线程开始新的调度。业务繁忙时,一个任务会有多个调度,可能导致数据处理异常。


③ 多个任务时,任务之间没有直接影响,多任务执行的快慢取决于CPU的性能


④ 触发方式 : (1)SimpleTrigger (2)CronTrigger


⑥ 能被集群实例化,支持分布式部署


⑦使用JobStoreCMT(JDBCJobStore的子类),Quartz 能参与JTA事务;Quartz 能管理JTA事务(开始和提交)在执行任务之间,这样,任务做的事就可以发生在JTA事务里。


3、Task:


① 默认单线程同步执行


② 单个任务时,当前次的调度完成后,再执行下一次任务调度


③ 多个任务时,一个任务执行完成后才会执行下一个任务。若需要任务能够并发执行,需手动设置线程


④ 触发方式:


与Quartz的CronTrigger的表达式类似

可以使用注解标注定时任务


4、总结:


4-1:pring task使用和配置起来更简单,更轻量。


4-2:任务执行,spring task的调度任务是串行的,意思就是如果配了多个任务的话,前面一个任务没有结束,后面的任务即使是时间到点了也不会跑。Quartz采用多线程 ,quartz默认情况下可以跑,不过网上说配置下也可以控制等上一个任务结束才能跑。


4-3:实现,Task注解实现方式,比较简单。Quartz需要手动配置Jobs。


4-4:调度,Task采用顺序执行:若当前调度占用时间过长,下一个调度无法及时执行;

Quartz采用异步:下一个调度时间到达时,会另一个线程执行调度,不会发生阻塞问题,但调度过多时可能导致数据处理异常


4-5:部署,Quartz可以采用集群方式,分布式部署到多台机器,分配执行定时任务

参考: https://blog.csdn.net/qq_41320105/article/details/87901701


二、springTask入门dmeo


web.xml


1dc618a0ed9580ce8bfa6facb208c08f.png

5d4c6812c8535adbb050f4ddf2e1bce8.png


三、项目中实战案例


1.秒杀商品列表的增量更新


每分钟执行查询秒杀商品表,将符合条件的记录并且缓存中不存在的秒杀商品存入缓存。

46a9d80a6e05e4e3b19d57a0ee70bcdf.png


2.过期秒杀商品的移除


每秒中在缓存的秒杀上皮列表中查询过期的商品,发现过期同步到数据库,并在缓存中移除该秒杀商品。

66ba272a0bfc97be54a5fa679e3d5482.png


四、 cron标识和例子


cron表达式格式


Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式:


(1)Seconds Minutes Hours DayofMonth Month DayofWeek Year


(2)Seconds Minutes Hours DayofMonth Month DayofWeek


每一个域可出现的字符如下:


Seconds:可出现", - * /"四个字符,有效范围为0-59的整数

Minutes:可出现", - * /"四个字符,有效范围为0-59的整数

Hours:可出现", - * /"四个字符,有效范围为0-23的整数

DayofMonth:可出现", - * / ? L W C"八个字符,有效范围为1-31的整数

Month:可出现", - * /"四个字符,有效范围为1-12的整数或JAN-DEc

DayofWeek:可出现", - * / ? L C #“四个字符,有效范围为1-7的整数或SUN-SAT两个范围。1表示星期天,2表示星期一, 依次类推

Year:可出现”, - * /"四个字符,有效范围为1970-2099年

每一个域都使用数字,但还可以出现如下特殊字符,它们的含义是:


(1):表示匹配该域的任意值,假如在Minutes域使用, 即表示每分钟都会触发事件。


(2)?:只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会。因为DayofMonth和 DayofWeek会相互影响。例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法: 13 13 15 20 * ?, 其中最后一位只能用?,而不能使用*,如果使用*表示不管星期几都会触发,实际上并不是这样。


(3)-:表示范围,例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次


(4)/:表示起始时间开始触发,然后每隔固定时间触发一次,例如在Minutes域使用5/20,则意味着5分钟触发一次,而25,45等分别触发一次.


(5),:表示列出枚举值值。例如:在Minutes域使用5,20,则意味着在5和20分每分钟触发一次。


(6)L:表示最后,只能出现在DayofWeek和DayofMonth域,如果在DayofWeek域使用5L,意味着在最后的一个星期四触发。


(7)W: 表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。例如:在 DayofMonth使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一 到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份


(8)LW:这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。


(9)#:用于确定每个月第几个星期几,只能出现在DayofMonth域。例如在4#2,表示某月的第二个星期三。


cron表达式例子


1.3.2 Cron表达式例子

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触发


五、在线cron生成器


http://cron.qqe2.com/


相关文章
|
Java 数据库连接 Spring
Spring Boot命令行启动添加参数
Spring Boot命令行启动添加参数
1463 0
|
JavaScript 内存技术
Node版本管理工具 - Nvm的下载、安装配置与使用
Node版本管理工具 - Nvm的下载、安装配置与使用
4179 0
基于GA遗传算法的PID控制器参数优化matlab建模与仿真
本项目基于遗传算法(GA)优化PID控制器参数,通过空间状态方程构建控制对象,自定义GA的选择、交叉、变异过程,以提高PID控制性能。与使用通用GA工具箱相比,此方法更灵活、针对性强。MATLAB2022A环境下测试,展示了GA优化前后PID控制效果的显著差异。核心代码实现了遗传算法的迭代优化过程,最终通过适应度函数评估并选择了最优PID参数,显著提升了系统响应速度和稳定性。
896 15
|
SQL Java 关系型数据库
SpringBoot从入门到精通(三十)如何使用JdbcTemplate操作数据库?
前面介绍了Mybatis数据持久化框架,Mybatis虽然功能强大,但是,使用起来还是比较复杂的。所以接下来介绍一个简单的数据持久化框架——JdbcTemplate。
10459 2
SpringBoot从入门到精通(三十)如何使用JdbcTemplate操作数据库?
|
存储 弹性计算 Linux
阿里云账号注册、完成实名认证、试用云服务器和购买云服务器流程参考
本文为大家介绍新手用户从注册阿里云账号,完成实名认证,然后试用云服务器和购买云服务器的主要流程,适合初次购买和试用阿里云服务器的新手用户参考。
阿里云账号注册、完成实名认证、试用云服务器和购买云服务器流程参考
|
10月前
|
存储 容器 API
鸿蒙特效教程03-水波纹动画效果实现教程
本教程适合HarmonyOS初学者,通过简单到复杂的步骤,一步步实现漂亮的水波纹动画效果。
377 0
鸿蒙特效教程03-水波纹动画效果实现教程
|
机器学习/深度学习 存储 人工智能
【AI系统】模型演进与经典架构
本文探讨了AI计算模式对AI芯片设计的重要性,通过分析经典模型结构设计与演进、模型量化与压缩等核心内容,揭示了神经网络模型的发展现状及优化方向。文章详细介绍了神经网络的基本组件、主流模型结构、以及模型量化和剪枝技术,强调了这些技术在提高模型效率、降低计算和存储需求方面的关键作用。基于此,提出了AI芯片设计应考虑支持神经网络计算逻辑、高维张量存储与计算、灵活的软件配置接口、不同bit位数的计算单元和存储格式等建议,以适应不断发展的AI技术需求。
527 5
多进程同步之文件锁
【10月更文挑战第16天】文件锁是一种常用的多进程同步机制,它可以用于确保多个进程在访问共享资源时的互斥性。在使用文件锁时,需要注意锁的粒度、释放、竞争和性能等问题。通过合理使用文件锁,可以提高多进程程序的正确性和性能
|
编解码 搜索推荐 API
通义万相文本绘图与人像美化解决方案体验与评估
通义万相提供详尽文档和简易API调用,适合新手部署。服务集成便捷,响应迅速,模型泛化能力强,支持多样化风格,生成图片质量高。建议增强交互式编辑、多语言支持及智能推荐功能。相比竞品,通义万相成本控制优秀,易用性强,适用范围广泛。
561 8
|
机器学习/深度学习 人工智能 算法
AI大模型学习理论基础
本文探讨了AI大模型学习的理论基础,包括深度学习(模拟神经元工作原理,通过多层非线性变换提取特征)、神经网络结构(如前馈、循环和卷积网络)、训练方法(监督、无监督、强化学习)、优化算法(如SGD及其变种)、正则化(L1、L2和dropout防止过拟合)以及迁移学习(利用预训练模型加速新任务学习)。这些理论基础推动了AI大模型在复杂任务中的应用和人工智能的发展。