一、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) { //要執行的代碼 } } }
三、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_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>
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")); } } }
四、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分觸發(光棍節)