石英检测节点如何失败

Cal*_*Lai 6 cluster-computing quartz-scheduler

我的生产环境使用quartz 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`

有人有此信息吗?谢谢.

Mic*_*ski 6

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

简短版本:全部由数据库处理。重要的属性是 org.quartz.jobStore.clusterCheckinInterval。

长版(所有积分请访问http://flylib.com/books/en/2.65.1.91/1/):

检测失败的调度程序节点

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

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

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

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