在Quartz集群中选择节点以执行作业

时间:2011-01-31 04:08:32

标签: quartz-scheduler

我对Quartz集群有一些疑问,特别是有关触发器/作业如何在集群中执行的问题。

  1. 在执行作业时,quartz会给节点优先吗?比如总是或永远不是最后一次执行相同作业的节点,还是只是先到达作业的节点?

  2. 是否可以指定应该执行作业的节点?

2 个答案:

答案 0 :(得分:10)

对此的回答将是“取决于”。

对于quartz 1.x,答案是作业的执行总是(仅)在一个或多或少的随机节点上。 “随机性”实际上是基于哪个节点首先获得它。对于“繁忙”调度程序(总是要运行大量作业),这最终会在集群节点上提供相当均衡的负载。对于非繁忙的调度程序(仅偶尔触发的作业),有时可能看起来单个节点正在触发所有作业(因为调度程序在作业执行完成时查找要触发的下一个作业 - 因此节点刚刚完成执行倾向于找到下一个要执行的工作。)

对于标准石英,石英2.0(处于测试阶段)的答案与上述相同。但是Terracotta人员已经构建了他们的TerracottaJobStore企业版,它提供了更复杂的集群控制 - 当您调度作业时,您可以指定集群的哪些节点对作业的执行有效,或者您可以指定节点特征/必要条件,例如as“具有至少100 MB RAM可用的节点”。这也与ehcache一起使用,这样您就可以指定作业“在由X键入的数据是本地的节点上”。

答案 1 :(得分:0)

我使用Spring + AOP + memcached为我的Web应用程序解决了这个问题。如果作业已被执行,我的作业会从他们遍历的数据中知道,所以我唯一需要避免的是同时运行两个或更多节点。

你可以在这里阅读:

http://blog.oio.de/2013/07/03/cluster-job-synchronization-with-spring-aop-and-memcached/