ASP.NET MVC5+EF6+EasyUI 後臺管理系統(85)-Quartz 作業調度用法詳解二

系列目錄

前言

上一節我們學習了Quartz的基本用法

這一節學習通過XML配置的形式來執行任務

這一節主要認識一些屬性,爲下一步打基礎

代碼下載:鏈接:http://pan.baidu.com/s/1ge6jFDD 密碼:gaii

 我們在安裝了Quartz後,會在目錄下生成job_scheduling_data_2_0.xsd文件,此文件是XML配置智能提示用,如圖所示:有利於我們編寫XML

 實現

雖然有了智能提示,但是我們實際的配置也是照着模板來套入而已,下面來看一個XML

<?xml version="1.0" encoding="UTF-8"?>

<job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 version="2.0">
  <processing-directives>
    <overwrite-existing-data>true</overwrite-existing-data>
  </processing-directives>
  <schedule>
    <job>
      <name>jobName1</name>
      <group>jobGroup1</group>
      <description>jobDesciption1</description>
      <job-type>QuartzTest.HelloJob, QuartzTest</job-type>
      <durable>true</durable>
      <recover>false</recover>
      <job-data-map> <!--參數-->
        <entry>
          <key>key0</key>
          <value>value0</value>
        </entry>
        <entry>
          <key>key1</key>
          <value>value1</value>
        </entry>
        <entry>
          <key>key2</key>
          <value>value2</value>
        </entry>
      </job-data-map>
    </job>
    
    <trigger>
      <simple>
        <name>simpleName</name>
        <group>simpleGroup</group>
        <description>SimpleTriggerDescription</description>
        <job-name>jobName1</job-name>
        <job-group>jobGroup1</job-group>
        <start-time>2017-1-1 00:00:01</start-time>
        <end-time>2020-05-04 00:00:00</end-time>
        <misfire-instruction>SmartPolicy</misfire-instruction>
        <repeat-count>100</repeat-count>                  <!--執行100次-->
        <repeat-interval>1000</repeat-interval>           <!--間隔1秒一次-->
      </simple>
    </trigger>
  </schedule>
</job-scheduling-data>

解讀一下這個XML表達的意思:

  1. 在類庫QuartzTest下的命名空間QuartzTest下的類HelloJob是要執行的C#類方法,同樣繼承IJob
  2. 開始日期:2017-1-1 結束日期2020-5-4
  3. 執行100次
  4. 每一秒執行一次

也是很容易就看得懂!

同樣的您也可以把Cron表達式配置在Trigger節點

<trigger>
      <cron>
        <name>JobTrigger</name>
        <group>JobTriggerGroup</group>
        <job-name>ResourcesJob</job-name>
        <job-group>ResourcesGroup</job-group>
        <cron-expression>0 */1 * * * ?</cron-expression>
      </cron>
    </trigger>

 

調用方式:

同樣的在Main入口

            var properties = new NameValueCollection
            {
                ["quartz.scheduler.instanceName"] = "XmlConfiguredInstance",
                ["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz",
                ["quartz.threadPool.threadCount"] = "5",
                ["quartz.plugin.xml.type"] = "Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz",
                ["quartz.plugin.xml.fileNames"] = "~/quartz_jobs.xml"
            };


            ISchedulerFactory sf = new StdSchedulerFactory(properties);
            IScheduler sched = sf.GetScheduler();
            // we need to add calendars manually, lets create a silly sample calendar
            var dailyCalendar = new DailyCalendar("00:01", "23:59");
            dailyCalendar.InvertTimeRange = true;
            sched.AddCalendar("cal1", dailyCalendar, false, false);

            sched.Start();

NameValueCollection 屬性比較固定一般不需要更改,只需要指定XML的路徑即可

附錄

屬性的解析,有興趣的瞭解一下,不清楚也沒有關係,基本配置都是通用的,除非特別情況,我們再回過頭來研究

名稱                             必須    類型      默認值   
org.quartz.scheduler.instanceName 否 String
'QuartzScheduler' org.quartz.scheduler.instanceId 否 String 'NON_CLUSTERED' org.quartz.scheduler.instanceIdGenerator.class 否 String org.quartz.simpl.SimpleInstanceIdGenerator org.quartz.scheduler.threadName 否 String instanceName+'_QuartzSchedulerThread' org.quartz.scheduler.idleWaitTime 否 Long 30000 org.quartz.scheduler.dbFailureRetryInterval 否 Long 15000 org.quartz.scheduler.classLoadHelper.class 否 String org.quaartz.simpl.CascadingClassLoadHelper org.quartz.context.key.SOME_KEY 否 String None org.quartz.scheduler.jobFactory.class 否 String org.quartz.simple.SimpleJobFactory
·org.quartz.scheduler.instanceName 每個 Scheduler 必須給定一個名稱來標識。當在同一個程序中有多個實例時,這個名稱作爲客戶代碼識別是哪個 Scheduler 而用。假如你用到了集羣特性,你就必須爲集羣中的每一個實例使用相同的名稱,以使它們成爲“邏輯上” 是同一個 Scheduler 。
·org.quartz.scheduler.instanceId 每個 Quartz Scheduler 必須指定一個唯一的 ID。這個值可以是任何字符串值,只要對於所有的 Scheduler 是唯一的。如果你想要自動生成的 ID,那你可以使用 AUTO 作爲 instanceId 。從版本
1.5.1 開始,你能夠定製如何自動生成實例 ID。見 instanceIDGenerator.class 屬性,會在接下來講到。
·org.quartz.scheduler.instanceIdGenerator.
class 從版本 1.5.1 開始,這個屬性允許你定製instanceId 的生成,這個屬性僅被用於屬性 org.quartz.scheduler.instanceId 設置爲 AUTO 的情況下。默認是 org.quartz.simpl.SimpleInstanceIdGenerator ,它會基於主機名和時間戳來產生實例 ID 的。 ·org.quartz.scheduler.threadName 可以是對於 Java 線程來說有效名稱的任何字符串。假如這個屬性未予指定,線程將會接受 Scheduler 名稱 (org.quartz.scheduler.instanceName ) 前附加上字符串 '_QuartzSchedulerThread' 作爲名稱。 ·org.quartz.scheduler.idelWaitTime 這個屬性設置了當 Scheduler 處於空閒時轉而再次查詢可用 Trigger 時所等待的毫秒數。通常,你無需調整這個參數,除非你正使用 XA 事物,遇到了 Trigger 本該立即觸發而發生延遲的問題。 ·org.quartz.scheduler.dbFailureRetryInterval 這個屬性設置 Scheduler 在檢測到 JobStore 到某處的連接(比如到數據庫的連接) 斷開後,再次嘗試連接所等待的毫秒數。這個參數在使用 RamJobStore 無效。 ·org.quartz.scheduler.classLoadHelper.class 對於多數健狀的應用,所使用的默認值爲 org.quartz.simpl.CascadingClassLoadHelper 類,它會依序使用其他的 ClassLoadHelper 類,直到有一個能正常工作爲止。你大概沒必須爲這個屬性指定任何其他的類,除非有可能在應用服務器中時。當前所有可能的 ClassLoadHelper 實現可在 org.quartz.simpl 包中找到。 ·org.quartz.context.key.SOME_KEY 這個屬性用於向 "Scheduler 上下文" 中置入一個 名-值 對錶示的字符串值。(見 Scheduler.getContext() )。因此,比如設置了 org.quartz.context.key.MyEmail = [email protected] 就相當於執行了 scheduler.getContext().put("MyEmail", [email protected] ) ·org.quartz.scheduler.userTransactionURL 它設置了 Quartz 能在哪裏定位到應用服務器的 UserTransaction 管理器的 JNDI URL。默認值(未設定的話) 是 java:comp/UserTransaction ,這幾乎能工作於所有的應用服務器中。Websphere 用戶也許需要設置這個屬性爲 jta/usertransaction 。這個屬性僅用於 Quartz 配置使用 JobStoreCMT 的情況,並且 org.quartz.scheduler.wrapJobExecutionInUserTransaction 被設定成了 true 。 ·org.quartz.scheduler.wrapJobExecutionInUserTransaction 如果你要 Quartz 在調用你的 Job 的 execute 之前啓動一個 UserTransaction 的話,設置這個屬性爲 true 。這個事物將在 Job 的 execute 方法完成和 JobDataMap (假如是一個 StatefulJob ) 更新後提交。默認值爲 false 。 ·org.quartz.scheduler.jobFactory.class 這是所用的 JobFactory 的類名稱。默認爲 org.quartz.simpl.SimpleJobFactory 。你也可以試試 org.quartz.simpl.PropertySettingJobFactory 。一個 Job 工廠負責產生 Job 類的實例。SimpleFactory 類是調用 Job 類的 newInstance() 方法。PropertySettingJobFactory 也會調用 newInstance() ,但還會使用 JobDataMap 中的內容以反射方式設置 Job Bean 的屬性。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章