6

我的生产环境使用石英 2.1.4 运行 java 调度程序作业。在具有 4 台机器的 weblogic 集群服务器上,只有一个计划作业在一个集群节点(节点 1)上正常执行几个月,但节点 2 突然发现节点 1 在昨晚接管执行作业时失败。事实上,节点 1 没有错误(根据服务器、网络、数据库、应用程序日志),此事件导致由于 2 进程并发执行而创建了重复消息。

石英检测节点故障的机制是什么?通过 ping 扫描,或通过 UCP 广播的心跳 ping,或数据库响应时间等?上面有什么配置吗?

我已经阅读了石英配置指南 http://quartz-scheduler.org/documentation/quartz-2.1.x/configuration/ConfigJDBCJobStoreClustering ,但没有答案。

我正在使用 JDBCJobstore。经过详细检查,我们发现有一个数据库(Oracle)语句执行异常长(从5秒到30秒)。事件发生在这段时间。你觉得有关系吗?

我的配置是

` org.quartz.threadPool.threadCount=10

org.quartz.threadPool.threadPriority=5

org.quartz.jobStore.misfireThreshold = 10000

org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX `

有人有这个信息吗?谢谢。

4

1 回答 1

4

我知道答案很晚,但也许像我们俩这样的人仍然需要它。

短版:全部由 DB 处理。重要的属性是 org.quartz.jobStore.clusterCheckinInterval。

长版(所有学分都转到http://flylib.com/books/en/2.65.1.91/1/):

检测失败的调度程序节点

当调度程序实例执行签入例程时,它会查看是否有其他调度程序实例在他们应该签入时没有签入。它通过检查 SCHEDULER_STATE 表并查找 LAST_CHECK_TIME 列中的值早于属性 org.quartz.jobStore.clusterCheckinInterval 的调度程序(在下一节中讨论)来做到这一点。如果一个或多个节点尚未签入,则正在运行的调度程序假定其他实例已失败。

此外,下一段可能也很重要:

在时钟不同步的不同机器上运行节点

正如你现在可以确定的,如果你在不同的机器上运行节点并且时钟不同步,你会得到意想不到的结果。这是因为时间戳被用于通知其他实例上次签入一个节点的时间。如果该节点的时钟设置为将来,正在运行的调度程序可能永远不会意识到节点已关闭。另一方面,如果在过去设置了一个节点上的时钟,则节点可能会假设该节点已关闭并尝试接管并重新运行其作业。无论哪种情况,这都不是您想要的行为。当您在集群中使用不同的机器时(这是正常情况),请务必同步时钟。有关如何执行此操作的详细信息,请参阅本章后面的“Quartz Clustering Cookbook”部分。

于 2017-02-21T11:08:04.710 回答