Clustering目前與JDBC-Jobstore(JobStoreTX或JobStoreCMT)和TerracottaJobStore一起使用。功能包括負(fù)載平衡和 job故障轉(zhuǎn)移(如果JobDetail的“請求恢復(fù)”標(biāo)志設(shè)置為true)。
使用JobStoreTX或JobStoreCMT進(jìn)行聚類通過將“org.quartz.jobStore.isClustered”屬性設(shè)置為“true”來啟用Clustering。Clustering中的每個實(shí)例都應(yīng)該使用相同的quartz.properties文件。這樣做的例外是使用相同的屬性文件,具有以下允許的異常:不同的線程池大小,以及“org.quartz.scheduler.instanceId”屬性的不同值。Clustering中的每個節(jié)點(diǎn)必須具有唯一的instanceId,通過將“AUTO”作為此屬性的值,可以輕松完成(不需要不同的屬性文件)。
不要在單獨(dú)的機(jī)器上運(yùn)行Clustering,除非它們的時鐘使用某種形式的時間同步服務(wù)(守護(hù)進(jìn)程)進(jìn)行同步,而這些時間同步服務(wù)(守護(hù)進(jìn)程)運(yùn)行非常有限(時鐘必須在彼此之間)。 如果您不熟悉如何執(zhí)行此操作, 請參閱http://www.boulder.nist.gov/timefreq/service/its.htm。
不要針對任何其他實(shí)例運(yùn)行的相同的一組表來啟動非群集實(shí)例。您可能會收到嚴(yán)重的數(shù)據(jù)損壞,一定會遇到不正常的行為。
每次觸發(fā)只能有一個節(jié)點(diǎn)有效。我的意思是,如果job有一個重復(fù)的trigger,告訴它每10秒鐘發(fā)射一次,那么在12:00:00,正好一個節(jié)點(diǎn)將運(yùn)行這個job,在12:00:10,一個節(jié)點(diǎn)將運(yùn)行job等。它不一定是每次相同的節(jié)點(diǎn) - 它或多或少是隨機(jī)的,哪個節(jié)點(diǎn)運(yùn)行它。負(fù)載平衡機(jī)制對于繁忙的調(diào)度程序(大量的trigger)來說是近乎隨機(jī)的,但是有利于于non-busy(例如一個或兩個trigger)調(diào)度程序活動的同一個節(jié)點(diǎn)。
使用TerracottaJobStore進(jìn)行Clustering簡單地將調(diào)度程序配置為使用TerracottaJobStore(第9課:JobStores中介紹),并且您的調(diào)度程序?qū)⑷吭O(shè)置為Clustering。
您可能還需要考慮如何設(shè)置Terracotta服務(wù)器,特別是打開諸如持久性等功能的配置選項(xiàng),以及運(yùn)行一系列用于HA的Terracotta服務(wù)器。
TerracottaJobStore的企業(yè)版提供了高級的Quartz Where功能,允許將作業(yè)的智能定位到適當(dāng)?shù)腃lustering節(jié)點(diǎn)。
有關(guān)此JobStore和Terracotta的更多信息, 請?jiān)L問http://www.terracotta.org/quartz
如第9課:JobStores所述,JobStoreCMT允許在較大的JTA事務(wù)中執(zhí)行Quartz調(diào)度操作。
通過將“org.quartz.scheduler.wrapJobExecutionInUserTransaction”屬性設(shè)置為“true”,jobs也可以在JTA事務(wù)(UserTransaction)內(nèi)執(zhí)行。使用此選項(xiàng)集,aa JTA事務(wù)將在Job的execute方法被調(diào)用之前開始(),并且在執(zhí)行調(diào)用之后commit()終止。這適用于所有jobs。
如果您希望指定每個jobs是否JTA事務(wù)應(yīng)該包裝其執(zhí)行,那么您應(yīng)該在jobs類上使用 @ExecuteInJTATransaction注釋。
除了Quartz自動將Job執(zhí)行包裝到JTA事務(wù)中,在Scheduler界面上進(jìn)行的調(diào)用也可以在使用JobStoreCMT時參與事務(wù)處理。在調(diào)用程序調(diào)用方法之前,確保已經(jīng)啟動了一個事務(wù)。您可以直接通過使用UserTransaction或?qū)⑹褂谜{(diào)度程序的代碼放在使用容器管理事務(wù)的SessionBean中來執(zhí)行此操作。
更多建議: