您的位置:首页 > 其它

使用Quartz实现定时作业

2019-06-13 17:23 609 查看

该文章是系列文章 基于.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<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
的配置,如果再没有,代码内置的有默认的配置项。

使用XML文件配置

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.scheduler.instanceName - 此调度程序的名称将为“QuartzTest”,如果没配置,默认名称是“QuartzScheduler”
  • quartz.threadPool.threadCount - 最多可同时运行10个作业,如果现在有超过10个job需要执行的话,不会报错,但是将有job不能执行。
  • quartz.plugin.xml.type和quartz.plugin.xml.fileNames需要新加nuget包
    Quartz.Plugins
    ,指定了配置job详情的xml文件,该文件与
    quartz.config
    在同级目录下。

注意:新增了三个文件,分别是job_scheduling_data_2_0.xsd、quartz.config、quartz_jobs.xml,文件属性为

如果较新则复制

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/TestData

实现Job

详细文档地址: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!");
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: