2014-01-10 64 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可能不適合這項工作嗎?這聽起來像一個分佈式隊列可能是合適的。例如,一組競爭的客戶端可以儘可能快地從隊列中抽取工作項目,以便處理它們。

相關問題