Quartz重复执行问题记录

Quartz重复执行问题记录,第1张

现象:在项目维护过程中,使用了Quartz框架,也就是定时执行任务的功能。但是,在多节点多并发的过程中,出现了一个问题,同一个trigger被多个机器重复的触发了。

Quartz的运行流程:

当任务达到触发条件的时候(当这条任务满足qrtz_cron_triggers表中定义的相关的时间表达式的时候)

qrtz_triggers表对应的这条记录的状态发生改变,同时下次触发时间根据时间表达式做出改变,同时根据sched_name找到qrtz_job_details

表中的具体job去执行

网上的解决办法:

整个过程就是:当job开始的时候去向zookeeper申请注册,只有当注册成功的时候才执行业务,失败则退出job。同时由于我这里是每天循环的

定时任务所以当zookeeper下的节点数目达到一定的个数的时候加一个删除锁(就是向zookeeper create一个ondetele节点),同时删除之前

的triggername节点,这样保证了明天这些任务可以继续完成。至此,任务重复执行的问题就解决了。

2网上有网友解释:如果我在10:00:00执行了一个任务,下次就是15s,但是如果服务器挂掉,我在10:00:50重新启动服务器,由于任务间隔是15s,所以从00-50s中间会有三个任务超时没有执行(本来应该分别是在15s,30s,45s执行),而超时的时间均小于1min,所以服务器启动以后会立即开启三个quartz线程来执行超时的任务。

方法1、通过改TOMCAT的配置文件serverxml配置

方法2、先把quartz配置信息提取出来,单独存成一个文件,比如applicationContext-quartzxml 然后修改webxml,让web容器启动时,可以加载该文件 。(此文没对此方法进行深入探究)

参考链接: >

1Quartz中的触发器Trigger Job 包含了要执行任务的逻辑,但是 Job 对何时该执行却一无所知。这个事情留给了 Trigger。Quartz Trigger 继承了抽象的 orgquartzTrigger 类。当前,Quartz 有三个可用的 Trigger: Java代码 ·orgquartzSimpleTr

以上就是关于Quartz重复执行问题记录全部的内容,包括:Quartz重复执行问题记录、c#中quartz.net 中3个Job 都要从A表读取Flag=0的数据,然后根据业务区改Flag的值.、quartz执行时能不能获取到request等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9453865.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存