我在群集模式下运行Quartz作业。这是我的配置。是否可以更改作业运行时节点(JMX RMI)?
例如我的服务器有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 :(得分:0)
不直接。我不认为选择运行作业的服务器是Quartz标准版本的一部分。它可以在Quartz Scheduler Where中找到。
如果你想继续使用RMI,你可能会编写一个程序,根据条件逻辑关闭集群中的一个调度程序(如果禁用该作业,它将阻止将来在所有服务器上执行)。来自the manual:
通过RMI使用Quartz时,需要启动Quartz实例 配置它通过RMI“导出”其服务。然后你创建 通过配置Quartz调度程序来“代理”它的客户端到服务器 工作到服务器。
打开RMI:
<prop key="org.quartz.scheduler.rmi.export">true</prop>
This page from O'Reilly详细描述了整个过程,并显示了从客户端管理远程实例的示例。修改他们的示例以关闭调度程序。
如果您对现成的解决方案持开放态度,MySchedule project是一个基于Web的UI,用于管理Quartz。它能够管理远程实例。
另一种方法是管理Quartz之外的同步。允许作业在所有节点上触发,但在作业中使用您自己的逻辑来确定当前节点是否应该实际执行任何处理。您可以使用JGroups或类似的库在节点之间传递负载信息。
最后,您是否认为Quartz可能不适合这项工作?听起来像分布式队列可能是合适的。例如,一组竞争客户端可以尽快从队列中提取工作项。