Job Stores

2018-09-18 14:36 更新

JobStore負(fù)責(zé)跟蹤您提供給調(diào)度程序的所有“工作數(shù)據(jù)”:jobs,triggers,日歷等。為您的Quartz調(diào)度程序?qū)嵗x擇適當(dāng)?shù)腏obStore是重要的一步。幸運(yùn)的是,一旦你明白他們之間的差異,那么選擇應(yīng)該是一個(gè)非常簡(jiǎn)單的選擇。

您聲明您提供給用于生成調(diào)度程序?qū)嵗腟chedulerFactory的屬性文件(或?qū)ο螅┲心恼{(diào)度程序應(yīng)使用哪個(gè)JobStore(以及它的配置設(shè)置)。

切勿在代碼中直接使用JobStore實(shí)例。由于某種原因,許多人試圖這樣做。JobStore用于Quartz本身的幕后使用。你必須告訴Quartz(通過(guò)配置)使用哪個(gè)JobStore,但是你應(yīng)該只在代碼中使用Scheduler界面。

RAMJobStore

RAMJobStore是使用最簡(jiǎn)單的JobStore,它也是性能最高的(在CPU時(shí)間方面)。RAMJobStore以其明顯的方式獲取其名稱(chēng):它將其所有數(shù)據(jù)保存在RAM中。這就是為什么它是閃電般快的,也是為什么這么簡(jiǎn)單的配置。缺點(diǎn)是當(dāng)您的應(yīng)用程序結(jié)束(或崩潰)時(shí),所有調(diào)度信息都將丟失 - 這意味著RAMJobStore無(wú)法履行作業(yè)和triggers上的“非易失性”設(shè)置。對(duì)于某些應(yīng)用程序,這是可以接受的 - 甚至是所需的行為,但對(duì)于其他應(yīng)用程序,這可能是災(zāi)難性的。

要使用RAMJobStore(并假設(shè)您使用的是StdSchedulerFactory),只需將類(lèi)名稱(chēng)org.quartz.simpl.RAMJobStore指定為用于配置石英的JobStore類(lèi)屬性:

配置Quartz以使用RAMJobStore

org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

沒(méi)有其他需要擔(dān)心的設(shè)置。

JDBC JobStore

JDBCJobStore也被恰當(dāng)?shù)孛?- 它通過(guò)JDBC將其所有數(shù)據(jù)保存在數(shù)據(jù)庫(kù)中。因此,配置比RAMJobStore要復(fù)雜一點(diǎn),而且也不是那么快。但是,性能下降并不是很糟糕,特別是如果您在主鍵上構(gòu)建具有索引的數(shù)據(jù)庫(kù)表。在相當(dāng)現(xiàn)代的一套具有體面的LAN(在調(diào)度程序和數(shù)據(jù)庫(kù)之間)的機(jī)器上,檢索和更新觸發(fā)triggers的時(shí)間通常將小于10毫秒。

JDBCJobStore幾乎與任何數(shù)據(jù)庫(kù)一起使用,已被廣泛應(yīng)用于Oracle,PostgreSQL,MySQL,MS SQLServer,HSQLDB和DB2。要使用JDBCJobStore,必須首先創(chuàng)建一組數(shù)據(jù)庫(kù)表以供Quartz使用。您可以在Quartz發(fā)行版的“docs / dbTables”目錄中找到表創(chuàng)建SQL腳本。如果您的數(shù)據(jù)庫(kù)類(lèi)型尚未有腳本,請(qǐng)查看其中一個(gè)腳本,然后以數(shù)據(jù)庫(kù)所需的任何方式進(jìn)行修改。需要注意的一點(diǎn)是,在這些腳本中,所有的表都以前綴“QRTZ_”開(kāi)始(如表“QRTZ_TRIGGERS”和“QRTZ_JOB_DETAIL”)。只要你通知JDBCJobStore前綴是什么(在你的Quartz屬性中),這個(gè)前綴實(shí)際上可以是你想要的。對(duì)于多個(gè)調(diào)度程序?qū)嵗?,使用不同的前綴可能有助于創(chuàng)建多組表,

創(chuàng)建表后,在配置和啟動(dòng)JDBCJobStore之前,您還有一個(gè)重要的決定。您需要確定應(yīng)用程序需要哪種類(lèi)型的事務(wù)。如果您不需要將調(diào)度命令(例如添加和刪除triggers)綁定到其他事務(wù),那么可以通過(guò)使用JobStoreTX作為JobStore 來(lái)管理事務(wù)(這是最常見(jiàn)的選擇)。

如果您需要Quartz與其他事務(wù)(即J2EE應(yīng)用程序服務(wù)器)一起工作,那么您應(yīng)該使用JobStoreCMT - 在這種情況下,Quartz將讓?xiě)?yīng)用程序服務(wù)器容器管理事務(wù)。

最后一個(gè)難題是設(shè)置一個(gè)DataSource,JDBCJobStore可以從中獲取與數(shù)據(jù)庫(kù)的連接。DataSources在Quartz屬性中使用幾種不同的方法之一進(jìn)行定義。一種方法是讓Quartz創(chuàng)建和管理DataSource本身 - 通過(guò)提供數(shù)據(jù)庫(kù)的所有連接信息。另一種方法是讓Quartz使用由Quartz正在運(yùn)行的應(yīng)用程序服務(wù)器管理的DataSource,通過(guò)提供JDBCJobStore DataSource的JNDI名稱(chēng)。有關(guān)屬性的詳細(xì)信息,請(qǐng)參閱“docs / config”文件夾中的示例配置文件。

要使用JDBCJobStore(并假定您使用的是StdSchedulerFactory),首先需要將Quartz配置的JobStore類(lèi)屬性設(shè)置為org.quartz.impl.jdbcjobstore.JobStoreTX或org.quartz.impl.jdbcjobstore.JobStoreCMT - 具體取決于根據(jù)上述幾段的解釋?zhuān)龅倪x擇。

配置Quartz以使用JobStoreTx

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX

接下來(lái),您需要為JobStore選擇一個(gè)DriverDelegate才能使用。DriverDelegate負(fù)責(zé)執(zhí)行特定數(shù)據(jù)庫(kù)可能需要的任何JDBC工作。StdJDBCDelegate是一個(gè)使用“vanilla”JDBC代碼(和SQL語(yǔ)句)來(lái)執(zhí)行其工作的委托。如果沒(méi)有為您的數(shù)據(jù)庫(kù)專(zhuān)門(mén)制作另一個(gè)代理,請(qǐng)嘗試使用此委托 - 我們僅為數(shù)據(jù)庫(kù)制作了特定于數(shù)據(jù)庫(kù)的代理,我們使用StdJDBCDelegate(似乎最多!)發(fā)現(xiàn)了問(wèn)題。其他代理可以在“org.quartz.impl.jdbcjobstore”包或其子包中找到。其他代理包括DB2v6Delegate(用于DB2版本6及更早版本),HSQLDBDelegate(用于HSQLDB),MSSQLDelegate(用于Microsoft SQLServer),PostgreSQLDelegate(用于PostgreSQL)),WeblogicDelegate(用于使用Weblogic創(chuàng)建的JDBC驅(qū)動(dòng)程序)

選擇委托后,將其類(lèi)名設(shè)置為JDBCJobStore的委托使用。

配置JDBCJobStore以使用DriverDelegate

org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate

接下來(lái),您需要通知JobStore您正在使用的表前綴(如上所述)。

使用表前綴配置JDBCJobStore

org.quartz.jobStore.tablePrefix = QRTZ_

最后,您需要設(shè)置JobStore應(yīng)該使用哪個(gè)DataSource。命名的DataSource也必須在Quartz屬性中定義。在這種情況下,我們指定Quartz應(yīng)該使用DataSource名稱(chēng)“myDS”(在配置屬性中的其他位置定義)。

使用要使用的DataSource的名稱(chēng)配置JDBCJobStore

org.quartz.jobStore.dataSource = myDS
如果您的計(jì)劃程序正忙(即幾乎總是執(zhí)行與線程池大小相同的job數(shù)量),那么您應(yīng)該將DataSource中的連接數(shù)設(shè)置為線程池+ 2的大小。
可以將“org.quartz.jobStore.useProperties”配置參數(shù)設(shè)置為“true”(默認(rèn)為false),以指示JDBCJobStore將JobDataMaps中的所有值都作為字符串,因此可以作為名稱(chēng) - 值對(duì)存儲(chǔ)而不是在BLOB列中以其序列化形式存儲(chǔ)更多復(fù)雜的對(duì)象。從長(zhǎng)遠(yuǎn)來(lái)看,這是更安全的,因?yàn)槟苊饬藢⒎荢tring類(lèi)序列化為BLOB的類(lèi)版本問(wèn)題。

TerracottaJobStore

TerracottaJobStore提供了一種縮放和魯棒性的手段,而不使用數(shù)據(jù)庫(kù)。這意味著您的數(shù)據(jù)庫(kù)可以免受Quartz的負(fù)載,可以將其所有資源保存為應(yīng)用程序的其余部分。

TerracottaJobStore可以運(yùn)行群集或非群集,并且在任一情況下,為應(yīng)用程序重新啟動(dòng)之間持續(xù)的作業(yè)數(shù)據(jù)提供存儲(chǔ)介質(zhì),因?yàn)閿?shù)據(jù)存儲(chǔ)在Terracotta服務(wù)器中。它的性能比通過(guò)JDBCJobStore使用數(shù)據(jù)庫(kù)要好得多(約一個(gè)數(shù)量級(jí)更好),但比RAMJobStore要慢。

要使用TerracottaJobStore(并且假設(shè)您使用的是StdSchedulerFactory),只需將類(lèi)名稱(chēng)org.quartz.jobStore.class = org.terracotta.quartz.TerracottaJobStore指定為用于配置石英的JobStore類(lèi)屬性,并添加一個(gè)額外的行配置來(lái)指定Terracotta服務(wù)器的位置:

配置Quartz以使用TerracottaJobStore

org.quartz.jobStore.class = org.terracotta.quartz.TerracottaJobStore
org.quartz.jobStore.tcConfigUrl = localhost:9510
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)