使用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!"); } } }
相关文章推荐
- Spring--简单使用quartz实现定时作业
- Spring--简单使用quartz实现定时作业
- Spring -- 简单使用quartz实现定时作业
- Spring--简单使用quartz实现定时作业
- Spring--简单使用quartz实现定时作业
- Spring--简单使用quartz实现定时作业
- spring中如何使用quartz实现定时作业
- [转]Spring--简单使用quartz实现定时作业
- Spring--简单使用quartz实现定时作业
- Spring--简单使用quartz实现定时作业
- Spring--简单使用quartz实现定时作业
- SQL Server 2005使用作业实现定时备份任务和删除指定天数前的备份文件
- Spring框架中的Quartz定时任务使用笔记(通过@Scheduled注解的方式实现)
- OpenJWeb使用Spring框架实现定时作业调度的例子
- 使用Quartz实现定时任务
- 使用Quartz实现定时功能
- spring中使用quartz实现定时任务
- Web项目中使用Spring 3.x + Quartz 2.x实现作业调度详解
- Quartz实现定时任务的配置方法(纯java作业调度框架)
- C#反射动态调用dll中的方法及使用QuartZ.net实现作业调度