Job Stores

2018-09-18 14:36 更新

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

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

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

RAMJobStore

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

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

配置Quartz以使用RAMJobStore

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

沒有其他需要擔心的設(shè)置。

JDBC JobStore

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

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

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

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

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

要使用JDBCJobStore(并假定您使用的是StdSchedulerFactory),首先需要將Quartz配置的JobStore類屬性設(shè)置為org.quartz.impl.jdbcjobstore.JobStoreTX或org.quartz.impl.jdbcjobstore.JobStoreCMT - 具體取決于根據(jù)上述幾段的解釋,您所做的選擇。

配置Quartz以使用JobStoreTx

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

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

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

配置JDBCJobStore以使用DriverDelegate

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

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

使用表前綴配置JDBCJobStore

org.quartz.jobStore.tablePrefix = QRTZ_

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

使用要使用的DataSource的名稱配置JDBCJobStore

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

TerracottaJobStore

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

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

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

配置Quartz以使用TerracottaJobStore

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號