Quartz.NET 配置文件詳解


Ø  前言

在之前的 使用 Topshelf 結合 Quartz.NET 創建 Windows 服務 文章中,使用到了 Quartz 的兩個配置文件 quartz.config quartz_jobs.xml。由於篇幅原因,沒有細說,這里再說明下。本人覺得 Quertz 的強大之處莫過於他的配置文件,所以有必要深入理解下。

 

1.   首先,說說 quartz.config 文件

1)   先將上一篇中的配置貼出來

# You can configure your scheduler in either<quartz> configuration section

# or in quartz properties file

# Configuration section has precedence

 

quartz.scheduler.instanceName = TopshelfAndQuartz

 

# configure thread pool info

quartz.threadPool.type = Quartz.Simpl.SimpleThreadPool, Quartz

quartz.threadPool.threadCount = 10

quartz.threadPool.threadPriority = Normal

 

# job initialization plugin handles our xml reading, without it defaults are used

quartz.plugin.xml.type = Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz

quartz.plugin.xml.fileNames = ~/quartz_jobs.xml

 

# export this server to remoting context

#quartz.scheduler.exporter.type = Quartz.Simpl.RemotingSchedulerExporter, Quartz

#quartz.scheduler.exporter.port = 555

#quartz.scheduler.exporter.bindName = QuartzScheduler

#quartz.scheduler.exporter.channelType = tcp

#quartz.scheduler.exporter.channelName = httpQuartz

 

2)   以上標注為紅色的配置修改的可能性相對較大。

1.   quartz.scheduler.instanceName 指定調度器的實例名稱。

2.   quartz.threadPool.threadCount 設置線程池的最大線程數量。

3.   quartz.threadPool.threadPriority 設置作業中每個線程的優先級,可取 System.Threading.ThreadPriority 中的枚舉。

4.   quartz.plugin.xml.fileNames 指定 Quartz 的作業配置文件路徑及名稱,以上指定為 quartz_jobs.xml,默認情況下命名為該名稱即可。

 

3)   其他的沒什么說的,因為以上配置是 Quartz 的標准配置,如沒有特殊要求是不需要修改的。所以,這里一帶而過,以后有必要時再來研究它。

 

2.   然后,是 quartz_jobs.xml文件

1)   同樣,以上篇的配置為例:

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

 

<!-- This file contains job definitions in schema version 2.0 format -->

<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>UpdateInventoryJob</name>

      <group>Update</group>

      <description>定時更新商品庫存</description>

      <job-type>TopshelfAndQuartz.UpdateInventoryJob,TopshelfAndQuartz</job-type>

      <durable>true</durable>

      <recover>false</recover>

    </job>

    <trigger>

      <cron>

        <name>UpdateInventoryTrigger</name>

        <group>Update</group>

        <job-name>UpdateInventoryJob</job-name>

        <job-group>Update</job-group>

        <start-time>2017-12-01T00:00:00+08:00</start-time>

        <cron-expression>0 0/1 * * * ?</cron-expression>

      </cron>

    </trigger>

  </schedule>

 

</job-scheduling-data>

 

2)   這個配置文件相當重要,所有作業的調度都是由該文件定義的。其中最重要的節點是 cron-expression repeat-interval 節點,下面是每個節點的具體說明:

1.   job 作業節點,每個作業則對應一個 job 節點。

1)   name(必填)        作業名稱,同一個 group 中作業名稱不能相同。

2)   group(選填)       作業分組名稱,表示該作業所屬分組。

3)   description(選填) 作業描述,用於描述該作業的具體功能。

4)   job-type(必填)    指定作業將調用的作業實現類,格式為:命名空間.類名,程序集名稱。

5)   durable(選填)     表示該作業是否長久的,具體作用不詳,默認為true

6)   recover(選填)     字面意思是恢復,具體作用不詳,默認為false

 

2.   trigger 作業觸發器節點,用於定義指定的作業以何種方式觸發,一個作業可以有多個觸發器,而每個觸發器都獨立執行調度。

Ø  觸發器可以為以下三種類型

1)   calendar-interval 這種觸發器類型使用較少,此處省略。

2)   simple 簡單觸發器,可用於調度重復執行的作業。

1.   name(必填)        觸發器名稱,同一個 group 中作業名稱不能相同。

2.   group(選填)       觸發器分組名稱,表示該觸發器所屬分組。

3.   job-name(必填)    要調度的作業名稱,必須與 job 節點中的 name 相同。

4.   job-group(選填)   要調度的作業分組名稱,必須與 job 節點中的 group 相同。

5.   start-time(選填)  開始作業的 utc 時間,北京時間需要+08:00,例如:<start-time>2017-12-01T08:00:00+08:00</start-time>,表示北京時間2017121日上午8:00開始執行。注意:服務啟動或重啟時都會檢測此屬性。若沒有設置此屬性或者 start-time 的時間小於當前時間,服務啟動后會立即執行一次調度;若大於當前時間,服務會等到當前時間等於 start-time 的時間才開始執行。如果沒有特殊要求,可以忽略該屬性。

6.   repeat-count(選填)表示作業重復執行次數,-1表示無限制重復執行,3 表示作業重復執行三次。

7.   repeat-interval(必填)表示作業觸發間隔時間,10000 表示十秒觸發一次,單位:毫秒。

8.   示例:

<simple>

  <name>UpdateInventoryTrigger</name>

  <group>Update</group>

  <job-name>UpdateInventoryJob</job-name>

  <job-group>Update</job-group>

  <start-time>2017-12-01T00:00:00+08:00</start-time>

  <repeat-count>3</repeat-count>

  <repeat-interval>10000</repeat-interval>

</simple>

以上配置將在服務啟動后,每十秒觸發一次作業,共觸發三次,如圖:

clip_image001

 

1)   cron 復雜觸發器,使用 cron-expression 設置觸發器的行為

1.   name                simple 相同。

2.   group               simple 相同。

3.   job-name            simple 相同。

4.   job-group           simple 相同。

5.   start-time          開始作業的 utc 時間,北京時間需要+08:00,例如:<start-time>2017-12-01T08:00:00+08:00</start-time>,表示北京時間2017121日上午8:00開始執行。注意:服務啟動或重啟時都會檢測此屬性。若沒有設置此屬性,服務會根據 cron-expression 的規則執行作業調度;若 start-time 的時間小於當前時間,服務啟動后會忽略 cron-expression 的設置,立即執行一次調度,之后再根據 cron-expression 執行作業調度;若大於當前時間,服務會等到當前時間等於 start-time 的時間才開始執行,並根據 cron-expression 執行作業調度。如果沒有特殊要求,可以忽略該屬性。

6.   cron-expression(必填)cron 表達式,例如:<cron-expression>0 0/1 * * * ?</cron-expression>,表示間隔1分鍾觸發一次。注意:該節點為必須,如果省略整個服務將不能正常運行!

 

3.   詳解 cron-expression 節點

Ø  這個節點的設置相對復雜很多,因為所有的觸發需求都是由該節點來控制,比如(未經測試):

1.   每月11點觸發一次,表達式:0 0 1 1 * *

2.   每周日12點觸發一次,表達式:0 0 12 ? * SUN

3.   每天9點到18點每小時觸發一次,表達式:0 0 9-18 * * ?

 

Ø  詳細說明

1.   一個cron表達式有至少6個(或7個)由空格分隔的時間元素,按順序依次為:[] [] [小時] [] [] [] []

元素    必填        取值范圍                通配符

               0~59                    , - * /

               0~59                    , - * /

               0~23                    , - * /

               1~31                    , - * ? / L W

               0-11 or JAN-DEC         , - * /

                1-7 or SUN-SAT          , - * ? / L #

                empty or 1970-2099      , - * /

其中,周取值:1=周日~7=周六,1=SUN2=MON3=TUE4=WED5=THU6=FRI7=SAT

 

2.   通配符說明:

1)   * 表示所有值,例如:分設置為"*",表示每一分鍾都會觸發。

2)   ? 表示不指定值,使用場景不需要關心當前的這個元素。例如:要在每月的10號觸發一個操作,但不關心是周幾,所以周設置為"?",具體設置為 0 0 0 10 * ?

3)   - 表示區間,例如:在小時上設置"10-12",表示10,11,12點都會觸發。注意:這里的區間是包頭包圍的,比如配置是:0 0/15 9-22 * * ?,則表示9:00~22:59,每15分鍾觸發一次。

4)   , 表示指定多個值(列表),例如:在周字段上設置"MON,WED,FRI",表示周一、周三、周五都會觸發。

5)   / 用於遞增觸發,例如:在秒上面設置"5/15",表示從5秒開始,每增15秒觸發一次(5,20,35,50)

6)   L 表示最后的意思。在日字段設置上,表示當月的最后一天(依據當前月份,如果是二月還會依據是否是潤年[leap]);在周字段上表示星期六,相當於"7""SAT"。如果在"L"前加上數字,則表示該數據的最后一個。例如:在周字段上設置"6L"這樣的格式,則表示“本月最后一個星期五”。

7)   W 表示離指定日期的最近那個工作日(周一至周五)。例如:在日字段上設置"15W",表示離每月15號最近的那個工作日觸發。如果15號正好是周六,則找最近的周五(14)觸發,如果15號是周未,則找最近的下周一(16)觸發。如果15號正好在工作日(周一至周五),則就在該天觸發。如果指定格式為"1W",它則表示每月1號往后最近的工作日觸發。如果1號正是周六,則將在3號下周一觸發。(注:"W"前只能設置具體的數字,不允許區間"-")。

8)   # 序號,表示每月的第幾個周幾。例如:在周字段上設置"6#3"表示在每月的第三個周六。注意如果指定"#5",正好第五周沒有周六,則不會觸發該配置(用在母親節和父親節再合適不過了);小提示:'L''W'可以一組合使用。如果在日字段上設置"LW",則表示在本月的最后一個工作日觸發;周字段的設置,若使用英文字母是不區分大小寫的,即MONmon相同。

 

3.   常用示例:

0 0 12 * * ?            每天12點觸發

0 15 10 ? * *           每天1015分觸發

0 15 10 * * ?           每天1015分觸發

0 15 10 * * ? *         每天1015分觸發

0 0 12 ? * WED          每周三12點觸發

0 0/30 9-17 * * ?       每天九點到十五店,每半小時觸發

0 10,14,16 * * ?        每天上午10點,下午2點、4點觸發

0 15 10 * * ? 2005      2005年每天1015分觸發

0 * 14 * * ?            每天下午的2點到259分每分觸發

0 0/5 14 * * ?          每天下午的2點到259分(整點開始,每隔5分觸發)

0 0/5 14,18 * * ?       每天下午的 2點到259分、18點到1859分(整點開始,每隔5分觸發)

0 0-5 14 * * ?          每天下午的 2點到205分每分觸發

0 10,44 14 ? 3 WED      3月分每周三下午的 210分和244分觸發

0 15 10 ? * MON-FRI     從周一到周五每天上午的1015分觸發

0 15 10 15 * ?          每月15號上午1015分觸發

0 15 10 L * ?           每月最后一天的1015分觸發

59 59 23 L * ?          每月最后一天的235959秒觸發(經測試)

0 15 10 ? * 6L          每月最后一周的星期五的1015分觸發

0 15 10 ? * 6L 2002-2005    2002年到2005年每月最后一周的星期五的1015分觸發

0 15 10 ? * 6#3         每月的第三周的星期五開始觸發

0 0 12 1/5 * ?          每月的第一個中午開始每隔5天觸發一次

0 11 11 11 11 ?         每年的1111 1111分觸發(光棍節)

 

Ø  總結

本篇主要詳細的學習了 Quartz 的相關配置,這應該是 Quartz 的重要知識點,要一下子記住這些配置是不太可能的。所以,還需要在以后的工作中多多運用才行。


免責聲明!

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



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