Quartz部署了多个节点,为啥总是在特定节点执行

  1. Quartz集群

使用数据库来进行集群的管理

QRTZ_SCHEDULER_STATE 表用来存储各个实例,如下:前两个是运行在同一台Linux上的两个jar包。第三个是运行在一台windows上的jar包。

其中last_checkin_time是每个实例,自己报告的最后时间。

实例在更新自己的last_checkin_time时还会监测其他节点的,如果其他节点在last_checkin_time+last_checkin_tim<System.currentTimeMillis() 当前时间,说明这个节点已经超时未汇报自己的健康状态,此节点可能已经挂掉了

故障恢复:

如果故障节点有执行的任务,那么需要恢复故障任务。如果没有,那么就简单了。直接删除QRTZ_SCHEDULER_STATE的实例即可

注意:各个节点的时间应该同步,否则会出现错误判断的情况。

Quartz采用随机算法。Quartz官网上提到当前,还不存在一个方法来指派(钉住) 一个 Job 到集群中特定的节点。

  1. 任务的执行

QRTZ_TRIGGERS和QRTZ_FIRED_TRIGGERS是两张存储Trigger调度的表

多个实例是靠next_file_time 和 trigger_state来抢夺执行实例。如果多个实例的服务器时间是同步的,那么理论上在两个实例上执行的概率是随机的。实际情况是50.240上Centos系统的时间慢2分钟。这样,也似乎解释了。为啥一旦开启了别的实例。从来没有在Centos上执行过。

如下:

实例A,在QRTZ_TRIGGER表里面查询:条件是,到了next_fire_time并且trigger_state是WAITING的,一旦获取到,就把状态改成ACQUIRED。这样相当于该实例抢占成功。其他实例就无法获取到这条数据了。并且插入qrtz_fire_trigger一条数据,起始状态为ACQUIRED,qrtz_fire_trigger记录。这个表可以理解为正在执行的任务。会记录instance_name。可以知道具体哪个实例在运行

任务执行完成后,在一个事务中触发器状态更新为WAITING,删除FIRED_TRIGGERS表里对应的记录。

  1. 表汇总

QRTZ_BLOB_TRIGGERS 自定义的triggers使用blog类型进行存储

QRTZ_CALENDARS 以 Blob 类型存储 Quartz 的 Calendar 信息

qrtz_corn_triggers:记录cornTrigger的信息。

qrtz_fired_triggers:记录每个正在执行的触发器。

qrtz_job_details:记录每个任务的详细信息。

qrtz_locks:记录程序的悲观锁(防止多个节点同时执行同一个定时任务)。

QRTZ_PAUSED_TRIGGER_GRPS 存储已暂停的 Trigger 组的信息

qrtz_scheduler_state:记录 调度器(每个机器节点)的生命状态。

QRTZ_SIMPLE_TRIGGERS 存储简单的trigger,包括重复次数,间隔,以及触发次数

QRTZ_SIMPROP_TRIGGERS 存储CalendarIntervalTrigger和DailyTimeIntervalTrigger两种类型的触发器

qrtz_triggers:记录每个触发器的详细信息。

qrtz_locks存储程序的悲观锁的信息(假如使用了悲观锁)

Quartz提供的锁表,为多个节点调度提供分布式锁,实现分布式调度,默认有2个锁:

STATE_ACCESS主要用在scheduler定期检查是否有效的时候,保证只有一个节点去处理已经失效的scheduler。

TRIGGER_ACCESS主要用在TRIGGER被调度的时候,保证只有一个节点去执行调度。

定时任务就是向triggers和job表里面按规则写入数据。

Quartz 定时任务相关推荐

  1. quartz定时任务开发cron常用网站

    http://cron.qqe2.com/   cron表达式   只能看下5个时点 http://www.cronmaker.com/     能看500个时点 https://unixtime.5 ...

  2. 大数据互联网架构阶段 QuartZ定时任务+RabbitMQ消息队列

    QuartZ定时任务+RabbitMQ消息队列 一 .QuartZ定时任务解决订单系统遗留问题 情景分析: 在电商项目中 , 订单生成后 , 数据库商品数量-1 , 但是用户迟迟不进行支付操作 , 这 ...

  3. Quartz定时任务的基本搭建

    前言 个人地址:Quartz定时任务的基本搭建 Quartz是一个完全由Java编写的开源作业调度框架,为在java应用程序中进行作业调度提供了简单又强大的机制. Quartz中分为几个核心概念: J ...

  4. 记一次quartz定时任务不执行排雷

    过程 项目中需求统计数据,涉及大屏展示,展示的数据很复杂,所以采取了晚上把数据汇总出来存到redis缓存,供白天查询的方式. 用到了quartz定时任务,写好sql.逻辑等测试没问题,就愉快的部署到了 ...

  5. Quartz定时任务-@DisallowConcurrentExecution注解

    Quartz定时任务默认都是并发执行的,不会等待上一次任务执行完毕,只要间隔时间到就会执行, 如果定时任执行太长,会长时间占用资源,导致其它任务堵塞. 在Spring中这时需要设置concurrent ...

  6. bboss quartz定时任务使用案例介绍

    bboss quartz定时任务使用案例介绍 本文demo gradle工程源码地址: [url]https://github.com/bbossgroups/quartzdemo[/url] [si ...

  7. Quartz定时任务使用小记(11月22日)

    骤然接触quartz,先从小处着手,why,what,how quartz定时任务: 为什么使用quartz定时任务,以及定时任务在实际应用场景下的特定需求. 1.用户方面的需要,为了提供更好的使用体 ...

  8. Springboot 使用quartz 定时任务 增删改查

    前段时间公司项目用到了 定时任务 所以写了一篇定时任务的文章 ,浏览量还不错 , Springboot 整合定时任务 ) 所以就准备写第二篇, 如果你是一名Java工程师,你也可以会看到如下的页面 , ...

  9. quartz定时任务不执行

    quartz定时任务执行一段时间不执行的原因 数据库表QRTZ_TRIGGERS 里的TRIGGER_STATE 字段的值自动修改为ERROR了 ,quartz定时任务是不扫描这种ERROR情况. 之 ...

  10. Spring Boot配置Quartz定时任务

    1 Quartz定时任务 Quartz 是一个完全由 Java 编写的开源任务调度框架,为在 Java 应用程序中进行任务调度提供了简单却强大的机制. 基于定时.定期的策略来执行任务是它的核心功能,比 ...

最新文章

  1. 2019年衡水中学高考喜报
  2. CrowdRec:众包环境中,基于信任感知的工人推荐
  3. html中after伪类原理,css伪类before跟after原理与使用(原)
  4. SAP中凭证类型的作用
  5. linux mysql 停止,linux 里 重启 和停止 mysql的原理
  6. 这是东西:jUnit:动态测试生成
  7. BUUOJ reverse 不一样的flag
  8. 前向星及spfa大法
  9. 在RedHat Enterprise Linux 上Oracle 9i的安装配置与调优
  10. linux技巧33条
  11. vs2010 c++项目创建简易教程
  12. 将iPhone投影到Mac上
  13. 微信获取open ID
  14. 【andriod】设备APP开发之数据就地Excel存储
  15. android 自动背光闪烁,Android 背光流程小结
  16. 使用sh执行bash脚本的奇怪问题
  17. krpano资源下载及还原全景图
  18. c调python_C调和弦及组成音
  19. 苹果首席设计师艾维将离职开办新公司 还会开发苹果产品
  20. 全程软件测试之测试需求分析与计划(1)

热门文章

  1. 支付宝小程序唤起支付
  2. Opencv图像美颜滤镜
  3. Java基础之CAS算法
  4. 工作中使用到的单词(软件开发)
  5. 时间序列(数据分析)
  6. 浙大mooc翁凯 C语言笔记
  7. 2021-11-1-无法在此设备上激活WINDOWS因为无法连接到你的组织的激活服务器
  8. 《陶哲轩教你学数学》读后感
  9. 计算机里的本地安全策略在哪找,本地安全策略哪里去了?
  10. 如何将Web of Science中的题录及文章导入NoteExpress?