博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring学习笔记--quartz和定时任务执行
阅读量:5458 次
发布时间:2019-06-15

本文共 1978 字,大约阅读时间需要 6 分钟。

 

前言:

  最近要写一个定时任务, 用于同步数据. 以往这种涉及数据库操作的定时脚本, 都会采用python+crontab的方式来实现. 这次画风大转, 决定试试用spring+quartz来实现一下.

  

集成:

  由于Annotation(注解)的发展, quartz和spring的集成愈发的简洁和快速.
  maven的依赖配置:

org.quartz-scheduler
quartz
2.2.2

  spring的applicationContext.xml中, 添加task自动注入驱动

  同时在xmlns 中, 添加如下选项:

xmlns:task="http://www.springframework.org/schema/task"

  然后在xsi:schemaLocation中追加如下项即可:

http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd

  使用idea进行编辑时, 能够自动帮你导入命令空间和schema, 非常方便. 

定时任务编写:

  对于定时任务, 只要在类的方法上, 配置@Scheduled注解即可.

@Controllerpublic class TaskManager {  private static final Logger logger = LoggerFactory.getLogger("task");  // *)  @Scheduled(cron = "0 0/10 * * * *")  public void syncTask() {    logger.info(“task start”);    // TODO    // a timed task to execute…    logger.info(“task stop”);  }}

  注: 该任务, 每隔10分钟执行一次.

  其cron属性值和crontab的规则很像, 不过quartz的精度精确到秒级:

  1. Seconds
  2. Minutes
  3. Hours
  4. Day-of-Month
  5. Month
  6. Day-of-Week
  7. Year (可选字段)

  具体的crontab规则, 可查阅如下链接:

测试和特性:

  简单设计了几个case, 测试了下, 发现有些需要注意的地方.
  case 1:
  任务其设定的定时执行时间间隔为1分钟, 但是其执行需要消耗1.5分钟. 这种情况, 会演变成什么呢?
  1) 时刻1:00执行的任务, 和时刻1:01执行的任务, 同时存在并执行.
  2) 时刻1:00执行的任务继续执行, 时刻1:01触发的任务, 等待之前的任务完成, 然后执行.
  3) 时刻1:00执行的任务继续执行, 时刻1:01触发的任务被取消.
  经测试, 事实证明这种情况, 最终演变为3)这种预定, 既触发的任务会因为前一个任务超时, 而取消.
  case 2:
  如果设定, A类型任务因时间点触发, 但此时仍旧有B类型任务在执行. 这种情况下, 会发生什么?
  1). A类型和B类型的任务同时执行
  2). A类型等待B类型任务执行完, 然后调度并执行
  3). A类型任务会取消这次运行.
  经测试, 事实证明还是3)这种预定, 既触发的任务会因有其他任务占据, 而取消.
  这个确实是需要注意一下的, 特此记录一下. 感觉quartz默认的机制是单线程模型, 而且其冲突解决方案采用取消策略, 估计也是为了防止任务堆积. 这和crontab并发执行的思路有差异. 一个向东, 一个向西, 都有其合理的一面.

后记:

  总的来说, 使用spring+quartz是非常的灵活和方便的, 门槛非常的低. quartz定时进程本身就是一个后台服务, 而crontab则是借助crond这个公共的后台服务来实现定时执行任务.
  对于quartz而言, 感觉并没有深入去研究. 比如其内部定时触发的机制, 还有冲突解决方案, 以及相关的配置设定. 后续有机会再去好好地深入研究一番.

公众号&游戏站点:

  个人微信公众号: 木目的H5游戏世界
  
  个人游戏作品集站点(尚在建设中...): (域名尚未备案),  请点击访问. 

 

转载于:https://www.cnblogs.com/mumuxinfei/p/4913624.html

你可能感兴趣的文章
学习:关于oracle序列(sequence)组成的主键和唯一的字符串组成的主键在性能上如何?...
查看>>
用一道面试题考察对闭包的理解
查看>>
android中判断某个应用是否存在
查看>>
How to change SAPABAP1 schema password In HANA
查看>>
mimics教程中文版——第二章
查看>>
Go并发编程实践
查看>>
CSS margin详解
查看>>
cesium编程入门(三)开始使用cesium开发
查看>>
4.18n阶勒让德多项式求解
查看>>
RTMP协议分析及推流过程
查看>>
PAT天梯赛L1-054 福到了
查看>>
Pains and Sickness 学习笔记
查看>>
PHP变量测试函数
查看>>
第六天 基本文件管理与XFS文件系统备份恢复
查看>>
win10中强制vs2015使用管理员启动
查看>>
UISerachBar / UISearchDisplayController
查看>>
Linux常用的操作命令
查看>>
Redis Desktop Manager
查看>>
css书写规范
查看>>
Asp.net +Jquery-uploadify多文件上传
查看>>