該文章是系列文章 基於.NetCore和ABP框架如何讓Windows服務執行Quartz定時做業 的其中一篇。
Quartz是一個開源的做業調度框架,準確的稱謂應該是 Quartz.Net
,它是Java開源項目Quartz Scheduler的一部分。
關於Quartz的功能可訪問 https://www.quartz-scheduler.net/features.html
nuget地址:https://www.nuget.org/packages/Quartz/3.0.7/
GitHub地址:https://github.com/quartznet/quartznethtml
首先是對定義的MyJobService進行完善。git
using System.Threading.Tasks; namespace Demo.MyJob { public class MyJobService { public async Task StartAsync() { //操做邏輯 } public async Task StopAsync() { //操做邏輯 } public async Task ContinueAsync() { //操做邏輯 } public async Task PauseAsync() { //操做邏輯 } } }
完善以後的代碼以下github
using System.Threading.Tasks; using Quartz; using Quartz.Impl; namespace Demo.MyJob { public class MyJobService { private readonly Task<IScheduler> _defaultScheduler; private static IScheduler _scheduler; public MyJobService() { _defaultScheduler = StdSchedulerFactory.GetDefaultScheduler(); } public async Task StartAsync() { _scheduler = await _defaultScheduler; await _scheduler.Start(); } public async Task StopAsync() { await _scheduler.Shutdown(); } public async Task ContinueAsync() { await _scheduler.ResumeAll(); } public async Task PauseAsync() { await _scheduler.PauseAll(); } } }
IScheduler
是主要的接口,它由ISchedulerFactory
生成,StdSchedulerFactory
繼承自ISchedulerFactory
。StdSchedulerFactory
獲取配置的順序是先從App.config查找quartz section,沒找到就查找文件名爲quartz.config
的配置,若是再沒有,代碼內置的有默認的配置項。express
quartz.config
的簡略配置以下框架
quartz.scheduler.instanceName = QuartzTest quartz.threadPool.threadCount = 10 quartz.plugin.xml.type = Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz.Plugins quartz.plugin.xml.fileNames = ~/quartz_jobs.xml
Quartz.Plugins
,指定了配置job詳情的xml文件,該文件與quartz.config
在同級目錄下。注意:新增了三個文件,分別是job_scheduling_data_2_0.xsd、quartz.config、quartz_jobs.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>SayHelloJob</name> <group>SayHelloJobGroup</group> <description>SayHello</description> <job-type>Demo.MyJob.Jobs.SayHelloJob,Demo.MyJob</job-type> <durable>true</durable> <recover>false</recover> </job> <trigger> <cron> <name>SayHelloJobTrigger</name> <group>SayHelloJobGroup</group> <description>SayHello</description> <job-name>SayHelloJob</job-name> <job-group>SayHelloJobGroup</job-group> <start-time>2019-06-13T00:00:00+08:00</start-time> <cron-expression>0 30 1 * * ?</cron-expression> </cron> </trigger> </schedule> </job-scheduling-data>
job-type標識加載SayHelloJob的名稱,要指定正確否則報錯。更多配置能夠參考:Quartz.Tests.Integration/Xml/TestDataasync
詳細文檔地址:https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/index.htmlspa
IScheduler.Start(System.Threading.CancellationToken)
調用以後將啓動實現的Job,該Job必須繼承IJob
,執行的操做放在實現的Execute
方法中,該方法標識了Task,也就是說咱們能夠在Execute
方法內調用同步方法或者異步方法。.net
using System; using System.Threading.Tasks; using Quartz; namespace Demo.MyJob.Jobs { class SayHelloJob : IJob { public async Task Execute(IJobExecutionContext context) { await Task.Run(() => { Console.WriteLine("Hello World to Async!"); }); Console.WriteLine("Hello World!"); } } }