Quartz.Net進階之六:詳述 JobStores
一、介紹
今天開始學習 JobStore,別的先不說,也不用翻譯軟體來翻譯,直接從字面意思看來理解一下。我第一眼的感覺就是 job 是任務的意思,Store 是商店的意思,連起來就是可以儲存 Job 的商店,或者說專門用來儲存 Job 的容器。廢話少說,開始我們今天的學習吧。
二、詳述 JobStore
JobStore 負責跟蹤您為排程程式提供的所有“工作資料”:任務,觸發器,日曆等。為 Quartz 排程程式例項選擇適當的IJobStore實現是一個重要的步驟。 幸運的是,一旦你理解了它們之間的差異,選擇應該是一個非常簡單的選擇。 在向 SchedulerFactory 提供的用於生成排程器例項的屬性檔案(或物件)中宣告排程器應該使用哪個 JobStore(及其配置設定)。
切勿在程式碼中直接使用 JobStore 例項。 出於某種原因,許多人試圖這樣做。 JobStore 用於Quartz本身的幕後使用。 您必須告訴 Quartz(通過配置)使用哪個 JobStore,但是您應該只使用程式碼中的Scheduler介面。
1、RAMJobStore
RAMJobStore是使用最簡單的JobStore,它也是效能最高的(就CPU時間而言)。 RAMJobStore 以見名知意的方式命名:它將所有資料儲存在RAM記憶體中。 這就是它閃電般快速的原因,也是配置如此簡單的原因。 缺點是,當您的應用程式結束(或崩潰)時,所有排程資訊都將丟失 - 這意味著 RAMJobStore 無法遵守作業和觸發器上的“非易失性”設定。 對於某些應用程式,這是可以接受的 - 甚至是期望的行為,但對於其他應用程式,這可能是災難性的。
配置Quartz以使用RAMJobStore
quartz.jobStore.type = Quartz.Simpl.RAMJobStore, Quartz
要使用 RAMJobStore(假設您正在使用StdSchedulerFactory),您不需要做任何特殊的事情。 Quartz.NET的預設配置使用 RAMJobStore 作為任務儲存實現。
2、ADO.NET Job Store (AdoJobStore)
AdoJobStore 這個名字取的也很恰如其分 - 它通過ADO.NET將所有資料儲存在資料庫中。 因此,配置比RAMJobStore要複雜一些,而且速度也不快。 但是,效能這方面的缺點並不是非常的糟糕,特別是如果您使用主鍵上的索引構建資料庫表。
要使用AdoJobStore,首先必須為Quartz.NET建立一組資料庫表以供使用。 您可以在 Quartz.NET 發行版的“database / dbtables”目錄中找到建立表的SQL指令碼。 如果您還沒有適用於自己的資料庫型別的指令碼,可以檢視其中現有的指令碼,然後根據個人的需求對其進行相應的修改。 需要注意的一點是,在這些指令碼中,所有表都以字首“QRTZ_”開頭,例如表“QRTZ_TRIGGERS”和“QRTZ_JOB_DETAIL”。 實際上,這個字首你可以做任何的修改和定義,只要你通知 AdoJobStore 字首是什麼(在你的Quartz.NET屬性中)。 對於在同一資料庫內為多個排程程式例項建立多組表,使用不同的字首可能很有用。
目前,作為作業儲存(Job Store)的內部實現的唯一選擇就是 JobStoreTX,它自己建立事務。 這與Quartz的Java版本不同,後者還可以選擇使用J2EE容器 JobStoreCMT 管理事務的 。
最後一個難題是設定一個數據源,AdoJobStore可以從中獲得與資料庫的連線。 資料來源在Quartz.NET屬性中定義。 資料來源資訊包含連線字串和ADO.NET委託資訊。
配置Quartz以使用JobStoreTx
quartz.jobStore.type = Quartz.Impl.AdoJobStore.JobStoreTX, Quartz
接下來,您需要為 JobStore 選擇要使用的 IDriverDelegate 實現。 DriverDelegate 是負責執行鍼對特定資料庫可能需要的任何ADO.NET工作。 StdAdoDelegate是一個使用“vanilla”ADO.NET程式碼(和SQL語句)來完成其工作的委託。 如果沒有專門為您的資料庫建立的另一個委託,請嘗試使用此委託 - 特殊委託通常具有更好的效能或變通方法來解決資料庫特定問題。 其他委託可以在“Quartz.Impl.AdoJobStore”名稱空間中找到,也可以在其子名稱空間中找到。
注意:如果您正在使用預設的StdAdoDelegate,則Quartz.NET會發出警告,因為當您有很多觸發器要從中選擇時,它的效能會很差。特定的委託具有特殊的SQL語句來限制結果集長度(SQLServerDelegate使用TOP n、PostgreSQLDelegateLIMITN、OracleDelegate ROWCOUNT()<=n等)。
選擇委託之後,將其類名設定為 AdoJobStore 要使用的委託。
配置AdoJobStore以使用DriverDelegate
quartz.jobStore.driverDelegateType = Quartz.Impl.AdoJobStore.StdAdoDelegate, Quartz
接下來,您需要通知JobStore您正在使用的表字首(如上所述)。
quartz.jobStore.tablePrefix = QRTZ_
最後,您需要設定JobStore應該使用哪個資料來源。 還必須在Quartz屬性中定義指定的資料來源。 在這種情況下,我們指定Quartz應該使用資料來源名稱“myDS”(在配置屬性中的其他位置定義)。
使用要使用的資料來源的名稱配置AdoJobStore
quartz.jobStore.dataSource = myDS
配置的最後一件事是設定資料來源連線字串資訊和資料庫提供程式。 連線字串是標準的ADO.NET連線,它是針對特定於驅動程式的。 資料庫提供程式是資料庫驅動程式的抽象,用於在資料庫驅動程式和Quartz之間建立鬆耦合。
設定資料來源的連線字串和資料庫提供程式
quartz.dataSource.myDS.connectionString = Server=localhost;Database=quartz;Uid=quartznet;Pwd=quartznet
quartz.dataSource.myDS.provider = MySql
目前支援以下資料庫提供程式:
SqlServer - SQL Server driver for .NET Framework 2.0
OracleODP - Oracle’s Oracle Driver
OracleODPManaged - Oracle’s managed driver for Oracle 11
MySql - MySQL Connector/.NET
SQLite - SQLite ADO.NET Provider
SQLite-Microsoft - Microsoft SQLite ADO.NET Provider
Firebird - Firebird ADO.NET Provider
Npgsql - PostgreSQL Npgsql
如果有最新的驅動程式是可用的,您應該使用最新版本的驅動程式,只需建立一個程式集繫結重定向即可。
如果您的排程程式非常繁忙(即幾乎總是執行與執行緒池大小相同的作業數,那麼您應該將資料來源中的連線數設定為大約執行緒池的大小+ 1。 這通常在ADO.NET連線字串中配置 - 有關詳細資訊,請參閱驅動程式實現。
“quartz.jobStore.useProperties”配置引數可以設定為“true”(預設為false),以指示 AdoJobStore 所有的值在 JobDataMaps 裡面都是以字串型別儲存,因此可以儲存為 名稱 - 值 對,而不是以序列化的形式儲存更復雜的物件在 BLOB 列中。 從長遠來看,這樣更安全,因為您可以避免將非字串(non-String)的型別反序列化為BLOB複雜型別時出現的類的版本問題。
配置 AdoJobStore 以將字串用作 JobDataMap 值(推薦)
quartz.jobStore.useProperties = true
三、總結
好了,今天就寫到這裡了。大家感覺應該很輕鬆,內容不多。還是老規矩,我把英文原文地址發出來,英文好的可以直接看英文,理解的會更好。地址如下:https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/trigger-and-job-listeners.html
不忘初心,繼續努力。