JobStore是用來跟蹤你加到調度器中的全部「工做數據」:任務、觸發器、日曆等等。因此爲你的Quartz調度實例選取合適的JobStore是很是重要的。幸運的是,當你理解了不一樣JobStore的特色之後這個選擇會變得很是容易。您能夠在您提供給SchedulerFactory的屬性文件(或對象)中聲明您的調度程序應使用哪一個JobStore(以及它的配置設置),以便用於生成調度程序實例。java
永遠不要在代碼中直接使用JobStore實例。許多用戶會由於各類緣由這麼作。JobStore僅限於Quartz自己的內部使用。你必須告訴Quartz(經過配置)使用哪一個JobStore,可是你應該只使用代碼中的Scheduler接口。數據庫
RAMJobStore是最簡單易用的一種JobStore,並且擁有最高的性能(在CPU運行時間方面)。RAMJobStore的運行方式就像他的名字同樣:它把全部數據存儲在內存中。這就是爲何它快如閃電,以及配置如此簡單的緣由。缺點是當你的應用程序結束(或崩潰)時,全部的調度信息都會丟失——這意味着RAMJobStore不能實現任務和觸發器的持久化。對於某些應用來講,這是能夠接受的——甚至是必須的,但對於另一些應用來講,這將是災難性的。安全
要使用RAMJobStore(並假設您使用的是StdSchedulerFactory),只需將類名稱org.quartz.simpl.RAMJobStore指定爲用於配置quartz的JobStore類屬性便可:服務器
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
除此以外沒有其餘東西須要配置了。性能
JDBCJobStore的功能一樣如其名——它經過JDBC把全部的數據存儲到數據庫。所以,它的配置比RAMJobStore稍微複雜一些,並且速度也不盡如人意。可是,它的性能也不是特別差,尤爲是你使用主鍵上的索引構建數據庫表時。在具備至關現代LAN的機器上(在調度器和數據庫之間),檢索和更新觸發器的時間一般小於10毫秒。spa
JDBCJobStore幾乎能夠運行在任何數據庫上,它已普遍用於Oracle,PostgreSQL,MySQL,MS SQLServer,HSQLDB和DB2。爲了使用JDBCJobStore,你必須首先建立一系列的表供Quartz使用。您能夠在Quartz發行版的「docs / dbTables」目錄中找到建立表的SQL腳本。若是您的數據庫類型沒有腳本,只需查看其中一個現有腳本,而後進行修改以適配您的數據庫類型便可。須要注意的是,全部的表名均之前綴「QRTZ_」開頭(好比表「QRTZ_TRIGGERS」和「QRTZ_JOB_DETAIL」)。這個前綴實際上能夠是任何你想要的,只要你告訴JDBCJobStore前綴是什麼(在你的Quartz配置文件中)。使用不一樣的前綴對於在同一數據庫中爲多個調度程序實例建立多組表,是頗有用的。線程
建立了這些表以後,在配置和啓動JDBCJobStore以前,您還須要作出更多重要的選擇。您須要肯定應用程序須要什麼類型的事務。若是您不須要將調度命令(如添加和刪除觸發器)與其餘事務綁定在一塊兒,那麼您可讓Quartz使用JobStoreTX做爲JobStore來管理事務(大多數狀況下都如此)。代理
若是您須要Quartz與其餘事務(即在J2EE應用程序服務器中)一塊兒工做,那麼您應該使用JobStoreCMT--在這種狀況下,Quartz將讓應用程序服務器容器管理事務。code
最後一個問題是設置JDBCJobStore的DataSource使它能夠鏈接到數據庫。你可使用幾種不一樣的方式在Quartz配置文件中定義DataSource。一種方法是讓Quartz建立和管理數據源自己 - 經過提供數據庫的全部鏈接信息。另外一種是由應用程序服務器管理DataSource,讓Quartz使用——經過向JDBCJobStore提供DataSource的JNDI名稱。有關這些屬性的詳細信息,請參閱「docs / config」文件夾中的示例配置文件。對象
要使用JDBCJobStore(並假設您使用的是StdSchedulerFactory),首先須要將Quartz配置的JobStore類屬性設置爲org.quartz.impl.jdbcjobstore.JobStoreTX或org.quartz.impl.jdbcjobstore.JobStoreCMT——取決於您根據上述幾段中的解釋所作的選擇。
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
接下來,您須要選擇JobStore使用的DriverDelegate。DriverDelegate負責執行您的特定數據庫可能須要的任何JDBC工做。StdJDBCDelegate是一個使用「vanilla」JDBC代碼(和SQL語句)來完成工做的委託。若是沒有專門爲您的數據庫建立的另外一個委託,請嘗試使用此委託 - 咱們僅爲使用StdJDBCDelegate(這彷佛是最多的!)發現問題的數據庫建立數據庫特定的委託。其餘委託能夠在「org.quartz.impl.jdbcjobstore」包或其子包中找到。其餘委託包括DB2v6Delegate(應用於DB2第六版及以前版本),HSQLDBDelegate(用於HSQLDB),MSSQLDelegate(用於微軟的SQLServer),PostgreSQLDelegate(用於PostgreSQL),WeblogicDelegate(用於使用由Weblogic製做的JDBC驅動程序),OracleDelegate(用於Oracle)等等。
選擇代理後,將其類名設置爲JDBCJobStore的代理以使用。
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
接下來,您須要告訴JobStore您使用的是什麼表前綴(正如上面討論的)。
org.quartz.jobStore.tablePrefix = QRTZ_
最後,您須要設置JobStore應該使用哪一個DataSource。指定的數據源也必須在你的Quartz配置文件中定義。在這種狀況下,咱們指定Quartz應該使用DataSource名稱「myDS」(在配置文件中的其餘位置定義)。
org.quartz.jobStore.dataSource = myDS
若是您的調度程序老是繁忙(即幾乎老是執行與線程池大小相同的做業數量),那麼您應該將DataSource中的鏈接數設置爲線程池大小+2左右。
能夠將「org.quartz.jobStore.useProperties」配置參數設置爲「true」(默認爲false),以便指示JDBCJobStore JobDataMaps中的全部值都是字符串,而後其能夠以鍵值對的方式存儲,而不是做爲一個複雜對象序列化後存入BLOB字段。從長遠來看,這更安全,由於您能夠避免將非String類序列化爲BLOB時出現的類版本問題。
TerracottaJobStore在不使用數據庫的狀況下提供了擴展性和健壯性。這意味着你的數據庫將再也不須要負擔Quartz的壓力,並且能夠將其全部資源保存到其餘應用程序中。
TerracottaJobStore能夠運行集羣或非集羣,而且不管是哪一種狀況,都會爲您的做業數據提供存儲,這些數據在應用程序從新啓動之間持續存在,由於數據存儲在Terracotta服務器中。它的性能比經過JDBCJobStore使用數據庫要好得多(大約好一個數量級),但比RAMJobStore慢得多。
要使用TerracottaJobStore(並假設您使用的是StdSchedulerFactory),只需配置org.quartz.jobStore.class = org.terracotta.quartz.TerracottaJobStore,而後額外添加一行指定Terracotta服務器的位置:
org.quartz.jobStore.class = org.terracotta.quartz.TerracottaJobStore org.quartz.jobStore.tcConfigUrl = localhost:9510
關於JobStore和Terracotta的更多信息能夠在http://www.terracotta.org/quartz找到。