2015-12-02 86 views
0

我有一個Tomcat Web應用程序A,它使用石英框架安排作業。它在RAM Jobstore上作爲一個實例運行。最近我們計劃遷移到JDBC Jobstore並設置一個集羣,這樣如果一個實例失敗,另一個實例將能夠運行該作業。羣集石英實例計劃重複作業?

這裏是我的問題:

我的,我們的應用程序A將掃描啓動和每隔10分鐘以後期間業務相關的數據庫表和石英錶的工作。如果我在兩個不同的tomcat實例上部署兩個A應用程序,那麼將通過Quartz計劃兩組重複的作業。

我應該如何解決這個問題?我是否需要提取將作業調度到單獨應用程序的代碼部分,並確保只部署了1個實例,以便只安排1組作業?但隨後問題就變成了 - 如果這個實例失敗了呢?在這種情況下如何實現故障轉移?

+0

http://quartz-scheduler.org/documentation/quartz-2.x/configuration/ConfigJDBCJobStoreClustering? – Marvin

+0

標籤[tag:clustering]是指數據挖掘問題。你的問題是關於Web服務器的負載平衡。 –

+0

如果你的石英是聚集模式,那麼就不會有重複的工作。只有一個實例會負責執行它。因此,如果您的應用程序處於羣集模式,那麼您可以擁有多個應用程序實例。 –

回答

0

可以使任務「掃描啓動時的業務相關的數據庫表和石英錶的工作和每10分鐘之後」本身在羣集實例石英一個cron任務。

以下是基於Spring的解決方案。儘管您可以使用這個想法輕鬆轉換爲非基於彈簧的解決方案。

設置cron觸發每10分鐘內。

<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> 
    <property name="jobDetail" ref="runMeJob" /> 
    <property name="cronExpression" value="0 */10 * * * ?" /> 
</bean> 

設置了一個Job。這裏你將需要一個Spring實例的類實例。這個類實例將有一個公共方法,當觸發器被觸發時它將被調用。在此方法中,您將編寫任務以掃描數據庫並安排這些作業。

<bean id="cronJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> 
    <property name="targetObject" ref="yourObject" /> 
    <property name="targetMethod" value="methodOfThatObject" />  
</bean> 

配置觸發和作業調度

<!--this should be your clustered quartz scheduler--> 
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
    <property name="jobDetails"> 
     <list> 
      <ref bean="cronJob" /> 
     </list> 
    </property> 

    <property name="triggers"> 
     <list> 
     <ref bean="cronTrigger" /> 
     </list> 
    </property> 
</bean> 
+0

但是你會在同一個集羣中有多個實例,他們會嘗試安排重複的工作,對吧?如何確保只有一個實例在多個節點內進行調度?謝謝! – jmao

+0

當我們需要石英的多個實例和它們之間的協調以便只有一個實例執行作業時,需要集羣石英調度程序設置。 如果您通過cron調度作業,則可以將此cron調度任務本身作爲作業添加到此羣集調度程序中。說每十分鐘你需要掃描一些數據存儲(例如mysql)並安排工作。在這種情況下,假設羣集中有4個節點,只有一個實例將執行此調度cron任務。類似地,作業執行可以發生在集羣中的任何節點上。 –

+0

非常感謝你Prem!以前我並沒有意識到只有一個實例才能完成作業調度任務,就像作業本身一樣。這隻有在預配置時纔是正確的,對嗎?換句話說,如果我以編程方式調用scheduler.scheduleJob,那麼這個調用將由多個節點運行,對吧? – jmao

0

必須禁用併發執行,使得只有一個集羣中的節點。如果你使用Spring註解設置如下隨意拿起JOB觸發器級別 @DisallowConcurrentExecution