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`
有人有此信息吗?谢谢.
我知道答案已经很晚了,但也许像我们俩这样的人仍然需要它。
简短版本:全部由数据库处理。重要的属性是 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”部分。