2014-01-10 65 views
1

我在集群模式下运行Quartz作业。这是我的配置。是否有可能更改作业运行时节点(JMX RMI)?如何在运行时管理Quartz作业的集群模式?

例如我的服务器有2个节点。首先是太忙了,所以我需要把工作转到第二个工作。

<property name="quartzProperties"> 
    <props> 
     <prop key="org.quartz.scheduler.instanceName">myApp</prop> 
     <prop key="org.quartz.scheduler.instanceId">AUTO</prop> 
     <prop key="org.quartz.jobStore.misfireThreshold">60000</prop> 
     <prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop> 
     <prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.StdJDBCDelegate</prop> 
     <prop key="org.quartz.jobStore.tablePrefix">q</prop> 
     <prop key="org.quartz.jobStore.isClustered">true</prop> 
     <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop> 
     <prop key="org.quartz.threadPool.threadCount">5</prop> 
     <prop key="org.quartz.threadPool.threadPriority">5</prop> 
     <prop key="org.quartz.scheduler.skipUpdateCheck">true</prop> 
     <prop key="org.quartz.scheduler.jmx.export">true</prop> 
     <prop key="org.quartz.scheduler.jmx.objectName">quartz:type=QuartzScheduler,name=JmxScheduler,instanceId=NONE_CLUSTER</prop> 
    </props> 

回答

0

不是直接。我不认为选择运行作业的服务器是Quartz标准版本的一部分。它可在Quartz Scheduler Where

如果要继续使用RMI,可以编写一个程序,用于根据条件逻辑关闭群集中的其中一个调度程序(如果禁用该作业,则会阻止将来在所有服务器上执行)。从the manual

当通过RMI使用Quartz,你需要用它通过RMI配置为“出口”的服务开始石英 的一个实例。然后通过配置Quartz调度程序将其 工作“代理”到服务器,然后创建 客户端到服务器。

要打开RMI:

<prop key="org.quartz.scheduler.rmi.export">true</prop>

This page from O'Reilly详细地描述了整个过程,并示出了从客户端管理远程实例的例子。修改他们的示例以关闭调度程序。

如果您打开现成的解决方案,MySchedule project是一个基于Web的用于管理Quartz的UI。它能够管理远程实例。

另一种方法是管理Quartz之外的同步。允许作业在所有节点上触发,但在作业中使用自己的逻辑来确定当前节点是否应该实际进行任何处理。您可以使用JGroups或类似的库在节点之间传递负载信息。

最后,你认为Quartz可能不适合这项工作吗?这听起来像一个分布式队列可能是合适的。例如,一组竞争的客户端可以尽可能快地从队列中抽取工作项目,以便处理它们。

相关问题