Quartz.NET V2.6.2版本簡單使用


一、Nuget安裝命令

  Install-Package Quartz -Version 2.6.2

二、代碼實現

  Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Quartz;
using Quartz.Impl;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            //創建一個調度器工廠
            ISchedulerFactory iFactory = new StdSchedulerFactory();
            //從調度器工廠中獲取調度器
            IScheduler iScheduler = iFactory.GetScheduler();
            //創建作業(TaskStart是實現了IJob接口的類)
            IJobDetail iDetail = JobBuilder.Create<TaskStart>().Build();
            //添加作業名稱及分組名稱
            iDetail = iDetail.GetJobBuilder().WithIdentity("Job", "Group").Build();
            //創建觸發器1
            ITrigger iTrigger = TriggerBuilder.Create().Build();
            //添加觸發器名稱及分組名稱
            iTrigger = iTrigger.GetTriggerBuilder().WithIdentity("Trigger", "Group").Build();
            //添加觸發時間(下面是每天下午4點觸發一次)
            iTrigger = iTrigger.GetTriggerBuilder().WithCronSchedule("* * 16 ? * *").Build();
            //將作業與觸發器添加到調度器中
            iScheduler.ScheduleJob(iDetail, iTrigger);
            //啟動調度器
            iScheduler.Start();
            Console.ReadKey();
        }
    }

    public class TaskStart2 : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            //要執行的代碼
        }
    }
}
Program.cs代碼

 

三、XML配置實現

  創建quartz.config

#指定調度器的實例名稱
quartz.scheduler.instanceName = iScheduler
#格式:完整命名空間的類名,程序集名稱(應該是解析Xml文件的類吧,基本不用改)
quartz.plugin.xml.type = Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz
#XML配置文件的位置
quartz.plugin.xml.fileNames = ~/quartz_jobs.xml
quartz.config代碼

 

  創建quartz_jobs.xml

<?xml version="1.0" encoding="utf-8" ?>
<job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData">
  <processing-directives>
    <overwrite-existing-data>true</overwrite-existing-data>
  </processing-directives>
  <schedule>
    <!--作業節點,每個作業則對應一個job節點(多個任務請創建多個job節點即可)-->
    <job>
      <!--任務名稱,同一個group中多個job的name不能相同,若未設置group則所有未設置group的job為同一個分組-->
      <name>Job1</name>
      <!--任務所屬分組,用於標識任務所屬分組-->
      <group>Group1</group>
      <!--任務描述,用於描述任務具體內容-->
      <description>作業1</description>
      <!--任務類型,任務的具體類型及所屬程序集,格式:實現了IJob接口的包含完整命名空間的類名,程序集名稱-->
      <job-type>ConsoleApplication.TaskStart,ConsoleApplication</job-type>
      <!--表示該作業是否長久的,具體作用不詳,默認為true-->
      <durable>true</durable>
      <!--字面意思是恢復,具體作用不詳,默認為false。-->
      <recover>false</recover>
      <!--傳進去的參數-->
      <job-data-map>
        <!--參數StartDate-->
        <entry>
          <key>StartDate</key>
          <value>2018-11-01</value>
        </entry>
        <!--參數EndDate-->
        <entry>
          <key>EndDate</key>
          <value>2018-11-23</value>
        </entry>
      </job-data-map>
    </job>
    <!-- 任務觸發器,用於定義使用何種方式出發任務(job),同一個job可以定義多個trigger ,多個trigger 各自獨立的執行調度,每個trigger 中必須且只能定義一種觸發器類型(calendar-interval、simple、cron)-->
    <trigger>
      <!--復雜任務觸發器(使用cron表達式定制任務調度)-->
      <cron>
        <!--觸發器名稱,同一個group中觸發器名稱不能相同-->
        <name>Trigger</name>
        <!--觸發器分組名稱,表示該觸發器所屬分組-->
        <group>Group1</group>
        <!--觸發器描述,用於描述觸發器具體內容-->
        <description>觸發器1</description>
        <!--要調度的作業名稱,必須與 job 節點中的 name 相同-->
        <job-name>Job1</job-name>
        <!--要調度的作業分組名稱,必須與 job 節點中的 group 相同-->
        <job-group>Group1</job-group>
        <!--cron表達式(下面是每天下午兩點執行一次)-->
        <cron-expression>0 0 14 * * ? *</cron-expression>
      </cron>
    </trigger>
    <job>
      <name>Job2</name>
      <group>Group2</group>
      <description>作業2</description>
      <job-type>CarTravelLogStatisticsService.Job.TaskStart2,CarTravelLogStatisticsService</job-type>
      <durable>true</durable>
      <recover>false</recover>
    </job>
    <trigger>
      <!--簡單任務的觸發器,可以調度用於重復執行的任務-->
      <simple>
        <!-- 觸發器名稱-->
        <name>Trigger2</name>
        <!--觸發器分組名稱,表示該觸發器所屬分組-->
        <group>Group2</group>
        <!--觸發器描述,用於描述觸發器具體內容-->
        <description>觸發器2</description>
        <!--要調度的作業名稱,必須與 job 節點中的 name 相同-->
        <job-name>Job2</job-name>
        <!--要調度的作業分組名稱,必須與 job 節點中的 group 相同-->
        <job-group>Group2</job-group>
        <!--任務重復執行次數(-1:表示無限次執行,0:不重復執行,1:重復執行一次)-->
        <repeat-count>0</repeat-count>
        <!--任務重復執行觸發間隔(毫秒)(0:立即重復執行,1000:1秒后再重復執行)-->
        <repeat-interval>0</repeat-interval>
      </simple>
    </trigger>
  </schedule>
</job-scheduling-data>
quartz_jobs.xml代碼

 

  Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Quartz;
using Quartz.Impl;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            //創建一個調度器工廠
            ISchedulerFactory iFactory = new StdSchedulerFactory();
            //從調度器工廠中獲取調度器
            IScheduler iScheduler = iFactory.GetScheduler();
            //啟動調度器
            iScheduler.Start();
            Console.ReadKey();
        }
    }

    public class TaskStart : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            DateTime startTime = Convert.ToDateTime(context.JobDetail.JobDataMap["StartDate"]);
            DateTime endTime = Convert.ToDateTime(context.JobDetail.JobDataMap["EndDate"]);
            Console.WriteLine("開始時間:" + startTime.ToString("yyyy-MM-dd HH:mm:ss:fff"));
            Console.WriteLine("結束時間:" + endTime.ToString("yyyy-MM-dd HH:mm:ss:fff"));
        }
    }

    public class TaskStart2 : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            Console.WriteLine("現在的時間:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff"));
        }
    }
}
Program代碼

 

四、cron表達式規則

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

2、字段間順序和格式如下

序號

必填

意義

數據格式

特殊字符

1

0-59

, - * /

2

0-59

, - * /

3

0-23

, - * /

4

1-31

, - * ? / L W C

5

1-12 JAN-DEC

, - * /

6

1-7 SUN-SAT

, - * ? / L C #

7


1970-2099

, - * /

  其中,周取值:1=周日~7=周六,1=SUN,2=MON,3=TUE,4=WED,5=THU,6=FRI,7=SAT。

3、通配符說明:

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",則表示在本月的最后一個工作日觸發;周字段的設置,若使用英文字母是不區分大小寫的,即MON與mon相同。

4、常用示例:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

0 11 11 11 11 ?         每年的11月11號 11點11分觸發(光棍節)


免責聲明!

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



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