Quartz.NET 2.x 文件翻譯 - Lesson 9:JobStores

龐順龍發表於2019-05-11

Quartz.NET 2.x 文件翻譯 - Lesson 9:JobStores 檢視官網英文原文

返回目錄

JobStores負責跟蹤所有的scheduler排程“工作資料”,jobs, triggers, calendars, etc等。選擇合適的IJobStore實現是我們使用Quartz scheduler排程很重要的一步,其實只要我們熟悉這些實現,使用起來還是很方便的,只需要我們定義好哪個JobStore用於scheduler排程使用在SchedulerFactory的生產排程例項中。

我們不要在程式碼中直接使用JobStore,但是貌似很多人出於不同的原因這樣用了。JobStore是在Quartz中進行配置使用的,所以我們需要做的是告訴Quartz使用那個JobStore,最後在我們的程式碼中是通過使用Scheduler排程來操作的。

RAMJobStore

RAMJobStore是最簡單的JobStore,也是最高效的。RAMJobStore的命名來自於它的使用方式:它保持它的所有資料在RAM中,這也是為什麼它效能比較高的原因,配置也是很簡單便捷。缺點是當應用程式結束,所有排程資訊丟失,這個時候RAMJobStore就不能執行兌現“non-volatility”在job和Trigger上,再次啟動應用程式還需要從新配置等。對於某些應用程式來說可能是可以接受的,但是對於其他的則是不可以接受的。

Configuring Quartz to use RAMJobStore
quartz.jobStore.type = Quartz.Simpl.RAMJobStore, Quartz
使用RAMJobStore的時候我們不需要刻意做什麼,Quartz.NET的預設配置是使用RAMJobStore作為jobstore的實現。

ADO.NET Job Store (AdoJobStore)

AdoJobStore的命名也是基於其資料儲存方式,AdoJobStore通過 ADO.NET 將資料儲存在資料庫中。相對於RAMJobStore來說這就稍微有點複雜了,也不如前者效能高,不過效能損失也不是很厲害,如果我們建立好資料庫的主鍵索引,那麼效能也是可以的。

使用AdoJobStore,我們首先要建立一個資料庫給Quartz.NET使用,我們可以在我們下載的Quartz.NET目錄下的database資料夾找到建立表的sql語句,如果沒有你要用的資料庫型別的建立指令碼,可以參考其他型別的資料庫指令碼自己編寫一個就可以了,預設的指令碼建立都是用“QRTZ_”開頭的,我們也可以根據我們的需要來修改,只需要我們告訴AdoJobStore新的字首是什麼就ok了,使用不同的字首可以用於我們不同的業務,多個排程的時候,我們也可以在一個資料庫操作進行。

目前quartz.net內唯一可用的jobstore是JobStoreTX,這個不同於java版本的quartz,java版本的可以選擇是喲那個了J2EE容器管理事務的JobStoreCMT。

最後一項設定就是讓AdoJobStore能獲得資料庫連線併成功連線到資料庫,在我們的Quartz.NET屬性中設定Data資料來源,Data資料來源資訊包括連線字串和ADO.NET委託資訊。

Configuring Quartz to use JobStoreTx
quartz.jobStore.type = Quartz.Impl.AdoJobStore.JobStoreTX, Quartz
接下來,我們需要選擇一個IDriverDelegate來給JobStore使用,DriverDelegate用於我們資料庫的ADO.net操作。StdAdoDelegate是一個使用“vanilla” ADO.NET 程式碼來工作的的委託,如果沒有你使用資料庫的委託,嘗試使用此委託來解決特定資料庫問題。其他的委託可以檢視Quartz.Impl.AdoJobStore名稱空間下及其子空間下的。

注意:如果我們有很多的Trigger觸發器並使用預設的StdAdoDelegate(效能較差)來執行操作,Quartz.NET就會提示警告資訊,每一個資料庫委託都有特定的SQL語法來限定返回結果的長度(SQLServerDelegate 使用 TOP n, PostgreSQLDelegate LIMIT n, OracleDelegate ROWCOUNT() <= n etc.)。

一旦我們選擇了我們的資料庫委託,我們需要給AdoJobStore設定class名稱以便我們後續的使用。

Configuring AdoJobStore to use a DriverDelegate
quartz.jobStore.driverDelegateType = Quartz.Impl.AdoJobStore.StdAdoDelegate, Quartz
接下來我們需要設定資料庫表字首資訊給JobStore使用
Configuring AdoJobStore with the Table Prefix
quartz.jobStore.tablePrefix = QRTZ_
最後,我們需要設定JobStore的Data資料來源資訊,名稱也必須是在Quartz屬性定義好的,在這種情況下,我們可以使用資料來源名稱“myDS”。

Configuring AdoJobStore with the name of the data source to use
quartz.jobStore.dataSource = myDS
我們還需要配置的是data資料來源的連結字串和database驅動,連線字串是明確驅動的ADO.NET連線,資料庫提供程式是資料庫驅動的抽象,用於在Quartz和database之間建立鬆耦合的連線。

Setting Data Source’s Connection String And Database Provider
quartz.dataSource.myDS.connectionString = Server=localhost;Database=quartz;Uid=quartznet;Pwd=quartznet
quartz.dataSource.myDS.provider = MySql-50
quartz對以下資料庫提供程式已經做了支援:
  1. SqlServer-20 - SQL Server driver for .NET Framework 2.0
  2. OracleODP-20 - Oracle’s Oracle Driver
  3. OracleODPManaged-1123-40 Oracle’s managed driver for Oracle 11
  4. OracleODPManaged-1211-40 Oracle’s managed driver for Oracle 12
  5. MySql-50 - MySQL Connector/.NET v. 5.0 (.NET 2.0)
  6. MySql-51 - MySQL Connector/:NET v. 5.1 (.NET 2.0)
  7. MySql-65 - MySQL Connector/:NET v. 6.5 (.NET 2.0)
  8. SQLite-10 - SQLite ADO.NET 2.0 Provider v. 1.0.56 (.NET 2.0)
  9. Firebird-201 - Firebird ADO.NET 2.0 Provider v. 2.0.1 (.NET 2.0)
  10. Firebird-210 - Firebird ADO.NET 2.0 Provider v. 2.1.0 (.NET 2.0)
  11. Npgsql-20 - PostgreSQL Npgsql
如果可以的話,建議使用最新版本的驅動程式,只需要建立一個元件繫結重定向。

如果我們的Scheduler執行很繁忙,也就是總在執行和執行緒池資料類似的job任務),那麼我們就需要設定資料來源連線數大概線上程池數量範圍,通常是在ADO.NET連線字串中設定。

“quartz.jobStore.useProperties”配置引數可以設定為“True”(預設是False),設定後在AdoJobStore的JobDataMaps中的數值將是字串型別,這樣就可以儲存name-value這種鍵值對資料,就不在儲存物件系列化這種複雜的資料格式,這樣也較為安全,避免了不同版本序列化的問題。

配置adojobstore使用字串作為JobDataMap值(推薦) 
quartz.jobStore.useProperties = true

返回目錄

龐順龍最後編輯於:3年前

內容均為作者獨立觀點,不代表八零IT人立場,如涉及侵權,請及時告知。

相關文章