第11課 進階(企業級)特性 11.1 叢集
當前的叢集需要和JDBCJobstore (JobStoreTX或JobStoreCMT)和TerracottaJobStore一起工作。這個特定包括負載平衡和job容錯(如果JobDetail的“請求恢複”標誌設定為true的話)。
####使能JobStoreTX或JobStoreCMT的叢集,需要將“org.quartz.jobStore.isClustered”屬性設定為true。叢集中的一個scheduler執行個體都要使用同一份quartz.properties檔案。完全相同的屬性檔案,可以允許下面的例外:不同的線程池大小,不同的“org.quartz.scheduler.instanceId”屬性值。叢集中的每一個節點必須具有唯一的instanceId,這很容易實現(不需要不同的屬性檔案),只需要將這個屬性的值設定為AUTO即可。
注意:從來不要在分離的機器上運行叢集,除非它們的時鐘是同步的,使用一些時間同步服務(守護進程)且運行非常規律(the clocks must be within a second of each other)。如果不知道如何?,請參見http://www.boulder.nist.gov/timefreq/service/its.htm。
從來不要在經被其它執行個體啟動並執行相同資料表上觸發非叢集執行個體。這可能會發生嚴重資料錯誤,一定會出現不穩定的行為。
每一次觸發,都只有一個節點會觸發job。我說的意思是,如果job有一個重複trigger,告訴它每10s觸發一次,那麼在12:00:00隻有一個節點會運行這個job,在12:00:10也只有一個節點會運行這個job,等等。每一次不必是同一個節點:它在哪個節點上運行是隨機的。對於忙碌的scheduler(有許多trigger)來說,負載平衡機制幾乎是隨機的,但是對於不忙碌的scheduler來說,更喜歡用相同的處於active的節點。
####使用TerracottaJobStore的叢集,簡單配置scheduler使用TerracottaJobStore(第9課 JobStore介紹了),你的scheduler都是用於叢集的。
你也想要考慮如何設定Terracotta伺服器,尤其是開啟特性的配置選項,例如持久化,運行一組Terracotta伺服器以實現HA。
TerracottaJobStore的企業級版本提供了進階的Quartz Where特性,它允許智能的將job定向到合適的叢集節點上。
關於JobStore和Terracotta的更多資訊,請訪問http://www.terracotta.org/quartz 11.2 JTA事務
如第9課 JobStore介紹的,JobStoreCMT允許Quartz在更大的JTA事務中執行調度操作。
Jobs要想在JTA事務中執行(UserTransaction),要將屬性“org.quartz.scheduler.wrapJobExecutionInUserTransaction”設定為true。如果設定了這個屬性,在調用Job的execute方法之前,JTA事務會調用begin()方法,在execute結束之後會才調用commit()方法,適用於所有的Job。
如果你想要指定job是否讓JTA事務封裝它的執行,那麼你應該在Job類上使用@ExecuteInJTATransaction註解。
除了Quartz會自動將Job執行封裝到事務中,當使用JobStoreCMT時,Scheduler介面上的調用也會參與到事務中。在調用scheduler的方法之前,要確保已經啟動了事務。你可以通過使用UserTransaction直接啟動,或者將你的代碼放到使用容器託管事務的SessionBean中。