Quartz.Net進階之六:詳述 JobStores

        1、介紹

            今天開始學習 JobStore,別的先不說,也不用翻譯軟件來翻譯,直接從字面意思看來理解一下。我第一眼的感受就是 job 是任務的意思,Store 是商店的意思,連起來就是能夠存儲 Job 的商店,或者說專門用來存儲 Job 的容器。廢話少說,開始咱們今天的學習吧。

        2、詳述 JobStore

            JobStore 負責跟蹤您爲調度程序提供的全部「工做數據」:任務,觸發器,日曆等。爲 Quartz 調度程序實例選擇適當的IJobStore實現是一個重要的步驟。 幸運的是,一旦你理解了它們之間的差別,選擇應該是一個很是簡單的選擇。 在向 SchedulerFactory 提供的用於生成調度器實例的屬性文件(或對象)中聲明調度器應該使用哪一個 JobStore(及其配置設置)。

            切勿在代碼中直接使用 JobStore 實例。 出於某種緣由,許多人試圖這樣作。 JobStore 用於Quartz自己的幕後使用。 您必須告訴 Quartz(經過配置)使用哪一個 JobStore,可是您應該只使用代碼中的Scheduler接口。


            一、RAMJobStore

                RAMJobStore是使用最簡單的JobStore,它也是性能最高的(就CPU時間而言)。 RAMJobStore 以見名知意的方式命名:它將全部數據保存在RAM內存中。 這就是它閃電般快速的緣由,也是配置如此簡單的緣由。 缺點是,當您的應用程序結束(或崩潰)時,全部調度信息都將丟失 - 這意味着 RAMJobStore 沒法遵照做業和觸發器上的「非易失性」設置。 對於某些應用程序,這是能夠接受的 - 甚至是指望的行爲,但對於其餘應用程序,這多是災難性的。

                配置Quartz以使用RAMJobStore

html

                    quartz.jobStore.type = Quartz.Simpl.RAMJobStore, Quartz


                要使用 RAMJobStore(假設您正在使用StdSchedulerFactory),您不須要作任何特殊的事情。 Quartz.NET的默認配置使用 RAMJobStore 做爲任務存儲實現。


            二、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以使用JobStoreTxsql

                    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」(在配置屬性中的其餘位置定義)。

                使用要使用的數據源的名稱配置AdoJobStoreide

                    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

           
        3、總結

            好了,今天就寫到這裏了。你們感受應該很輕鬆,內容很少。仍是老規矩,我把英文原文地址發出來,英文好的能夠直接看英文,理解的會更好。地址以下:https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/trigger-and-job-listeners.html

            不忘初心,繼續努力。spa

相關文章
相關標籤/搜索