我们有一个有状态的石英作业,它负责使用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相关的频率?
感谢。
答案 0 :(得分:0)
您是否尝试过使用@DisallowConcurrentExecution?
http://quartz-scheduler.org/documentation/quartz-2.x/examples/Example4