该文章是系列文章 基于.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/quartznet
首先是对定义的MyJobService进行完善。
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()
{
//操作逻辑
}
}
}
完善之后的代码如下
using System.Threading.Tasks;
using Quartz;
using Quartz.Impl;
namespace Demo.MyJob
{
public class MyJobService
{
private readonly Task _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
的配置,如果再没有,代码内置的有默认的配置项。
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,文件属性为如果较新则复制
。
true
SayHelloJob
SayHelloJobGroup
SayHello
Demo.MyJob.Jobs.SayHelloJob,Demo.MyJob
true
false
SayHelloJobTrigger
SayHelloJobGroup
SayHello
SayHelloJob
SayHelloJobGroup
2019-06-13T00:00:00+08:00
0 30 1 * * ?
job-type标识加载SayHelloJob的名称,要指定正确不然报错。更多配置可以参考:Quartz.Tests.Integration/Xml/TestData
详细文档地址:https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/index.html
IScheduler.Start(System.Threading.CancellationToken)
调用之后将启动实现的Job,该Job必须继承IJob
,执行的操作放在实现的Execute
方法中,该方法标识了Task,也就是说我们可以在Execute
方法内调用同步方法或者异步方法。
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!");
}
}
}