有状态的石英作业在节点2上完成执行之前就开始在节点2上运行

时间:2013-12-11 04:18:25

标签: quartz-scheduler

我们有一个有状态的石英作业,它负责使用webservice为数据库表中的每个记录向外部系统发送更新(每条记录只需要向外部系统发送一条消息)。如果对外部系统的更新成功,则会从数据库中删除该记录。

触发器配置为每6秒触发一次。这项工作通常在1秒内完成执行。我们的应用程序在集群环境中运行。我们的quartz.properties文件中包含以下内容

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.jobStore.isClustered = true
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.misfireThreshold = 60000

由于这是一项有状态的工作,我们预计它不会同时执行。几乎所有时间都按预期工作。但有一段时间,我们会看到同时运行的工作会给我们带来一些问题。

执行的时间如下:

节点1:

Trigger 1 start time - 14:54:12 (picks record with id 10)
Trigger 1 end time   - 14:54:33 (finishes after trigger 2 and tries to delete the record which is already deleted by trigger 2)

节点2:

Trigger 2 start time - 14:54:22 (this also picks the record with id 10)
Trigger 2 end time   - 14:54:23 (finishes before trigger 1 and deletes the record in the database)

我们没有设置org.quartz.jobStore.clusterCheckinInterval属性,因此根据quartz 1.x文档(我们使用quartz 1.6.0)它必须是15000 ms。

我们检查了节点上的系统时间,它们是同步的。

有人可以帮我理解这个问题的原因吗?

作业如何触发与org.quartz.jobStore.clusterCheckinInterval相关的频率?

感谢。

1 个答案:

答案 0 :(得分:0)

您是否尝试过使用@DisallowConcurrentExecution?

http://quartz-scheduler.org/documentation/quartz-2.x/examples/Example4