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

            不忘初心,繼續努力。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM