quartz 集群 同一时间 如何保证 仅单个节点执行job

xfeiyu 发布于 2016/12/23 21:14
阅读 3K+
收藏 1

请教一下 我所遇到的集群问题,假设有一个定时任务执行时间预计为70秒(执行时间不可控),但是执行频率为每隔10秒一次,如何在同一个时刻保证集群中只有一个节点执行该定时job?

我认为若该job执行时间比较久,其他节点的定时任务都应该等待。

但是目前的现状是每个节点会串行的获取这个job的触发器,但是问题是第一个节点获取触发器之后正在执行job且还未执行完毕,第二个节点就能成功获取触发器,而且能执行job。我认为这个时候,第二个几点不应该成功获取触发器,也无法执行job才对。

已经看过quartz的源码,它为了保证串行获取触发器,使用数据库的qrtz_locks的悲观锁来控制,但是程序在读取完数据库中所有job相关信息后,会释放掉悲观锁,然后再执行job,这样就导致我遇到的问题,请教一个各位是否为我理解错误或者配置不正确导致?

加载中
0
Elven_Xu
Elven_Xu
排队?前面一个执行完后面的再执行
xfeiyu
xfeiyu
回复 @bushkarl : 目前的处理方式就是 分布式锁
bushkarl
bushkarl
回复 @xfeiyu : 可以在具体执行任务的job上加一个分布式锁,这样即使第二次触发执行也反馈上一个任务正在执行中。
xfeiyu
xfeiyu
我希望job都排队处理,但是问题怎么排队。这个最容易出现的场景是,a服务器启动调用定时任务且任务未完成,此时启动b服务器,就会调用定时任务了,这样的问题应该常见吧,我觉得quartz应该有解决方案的吧
0
蓝水晶飞机
蓝水晶飞机

你有没有观察到quartz有个statefulJob的类呢?

据介绍这个带状态的Job就是解决上一次的执行持续到下一次执行时间到了又执行的问题。

这个就是带“状态”的Job

org.quartz 
Interface StatefulJob

All Superinterfaces: Job
Deprecated.   use DisallowConcurrentExecution and/or PersistJobDataAfterExecution annotations instead.
@PersistJobDataAfterExecution @DisallowConcurrentExecution public interface StatefulJobextends Job

A marker interface for JobDetail s that wish to have their state maintained between executions.

StatefulJob instances follow slightly different rules from regular Job instances. The key difference is that their associated JobDataMap is re-persisted after every execution of the job, thus preserving state for the next execution. The other difference is that stateful jobs are not allowed to execute concurrently, which means new triggers that occur before the completion of the execute(xx) method will be delayed.

c
cwj_osc
回复 @xfeiyu : 我也遇到这个问题,不知道怎么办。也不知道问谁。还有一个问题,当一个trigger加锁后,同一个时间的其他trriger也不能触发了吗?我有些疑惑加锁这部分。怎么控制是个节点的同一个trriger还是同一个时间的不同trriger。
xfeiyu
xfeiyu
这个是解决单个节点上的并行执行和串行执行的问题的,我想解决的是分布式集群环境下,不同节点的并行执行问题,有啥办法没?
0
marvel888
marvel888

试试   Job接口实现类上加@DisallowConcurrentExecution 注解

0
东方太阳
东方太阳

<!-- 将并发设置为false,当多个trigger共同执行同一个jobDetail时按顺序执行 -->
    <property name="concurrent" value="false" />

0
周到的老周

在quartz中,一个trigger有状态属性,当trigger触发后,会更改该状态。在分布式环境下,一个trigger开始执行后,集群内的其他机器是触发该trigger的。是不是哪里配置错了。

0
弓箭手IN上海

https://bbs.csdn.net/topics/392287138

 

返回顶部
顶部