使用MongoDB作為Quartz JobStore

jopen 10年前發布 | 47K 次閱讀 MongoDB Quartz 作業調度框架

Quartz 是 OpenSymphony 開源組織在任務調度領域的一個開源項目,完全基于 Java 實現。該項目于 2009 年被 Terracotta 收購,目前是 Terracotta 旗下的一個項目。你可以到 http://www.quartz-scheduler.org/站點下載 Quartz 的發布版本及其源代碼。目前最新的版本是2.2.1。

作為一個優秀的開源調度框架,Quartz 具有以下特點:

  • 強大的調度功能,例如支持豐富多樣的調度方法,可以滿足各種常規及特殊需求;
  • 靈活的應用方式,例如支持任務和調度的多種組合方式,支持調度數據的多種存儲方式;
  • 分布式和集群能力,Terracotta 收購后在原來功能基礎上作了進一步提升。本文暫不討論該部分內容

另外,作為 Spring 默認的調度框架,Quartz 很容易與 Spring 集成。

下面是Quartz中的一些術語:

  • scheduler: 任務調度器
  • trigger: 觸發器,用于定義任務調度時間規則
  • job: 任務,即被調度的任務
  • misfire: 錯過的,指本來應該被執行但實際沒有被執行的任務調度

JobStore 負責保存Quartz Scheduler的工作數據, 所以當你的程序重啟時,或者在分布式的環境下, 你的應用程序都可以通過這些數據觸發事件。 你要基于你的應用程序選擇合適的JobStore, 首先你必須要了解各個JobStore, 之后才能容易的選擇JobStore。 Quartz框架本身提供了幾種JobStore:

  • RAMJobStore
    最簡單有效的一個JobStore。它將數據保存在內存中, 所以快是它的特點。缺點是當程序重啟時,內存中的數據丟失了,也就是quartz的所有的工作數據都必須重建。
    在屬性文件中配置此JobStore:
1
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
  • JDBCJobStore
    恰如其名, 此JobStore使用關系型數據庫保存Quartz的工作數據。由于需要讀取數據庫,它可能不如RAMJobStore那么快,但是能夠持久化數據。程序重啟時可以恢復Quartz。
    各種主流的數據庫都支持,如mysql, oracle, sql server,db2, postgresql, hsql等。
    在屬性文件中配置此JobStore:
1
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
  • TerracottaJobStore
    使用Terracotta server存儲數據。性能介于前兩者之間。
    在屬性文件中配置此JobStore:
1
org.quartz.jobStore.class = org.terracotta.quartz.TerracottaJobStore

此外還有一些第三方的JobStore,使用Nosql持久化數據。 比如redis-quartz, 還有這篇文章介紹的quartz-mongodb.

  • quartz-mongodb
    使用MongoDB持久化數據,JDBC中的表正好可以和MongoDB的collection相對應。
    你需要在pom.xml中加入此庫:
1
2
3
4
5
<dependency>
<groupId>com.novemberain</groupId>
<artifactId>quartz-mongodb</artifactId>
<version>1.8.0</version>
</dependency>

配置quartz的屬性:

# Use the MongoDB store
org.quartz.jobStore.class=com.novemberain.quartz.mongodb.MongoDBJobStore
# MongoDB URI (optional if 'org.quartz.jobStore.addresses' is set)
org.quartz.jobStore.mongoUri=mongodb://localhost:27020
# comma separated list of mongodb hosts/replica set seeds (optional if 'org.quartz.jobStore.mongoUri' is set)
org.quartz.jobStore.addresses=host1,host2
# database name
org.quartz.jobStore.dbName=quartz
# Will be used to create collections like mycol_jobs, mycol_triggers, mycol_calendars, mycol_locks
org.quartz.jobStore.collectionPrefix=mycol
# thread count setting is ignored by the MongoDB store but Quartz requries it
org.quartz.threadPool.threadCount=1

如果你使用Quartzite (quartz for Clojure), 需要配置JobStore如下:

1
org.quartz.jobStore.class=com.novemberain.quartz.mongodb.DynamicMongoDBJobStore

但是quartz-mongodb有一個很大的限制,就是 Quartz 不支持。
注意這里的集群是指quartz集群,不是MongoDB集群。

這一特性的缺乏相當致命, 畢竟大部分的Quartz應用還是集群模式。

來自:http://colobu.com/2014/08/11/Using-MongoDB-as-Quartz-Jobstore/

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!