定时任务框架 Quartz.NET 的简单应用
定时任务框架 Quartz.NET 的简单应用
博客园文章Id: 12659890
Quartz .NET
概述:
Quartz .NET 是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等。
- 定时数据库同步。
- 定时通知。
- 定时处理数据。
Quartz .NET允许开发人员根据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。整合了 Quartz .NET的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业。
接下来我们就来创建一个简单的例子来说明Quartz .NET 在定时任务方面的应用,大概步骤分为以下几步:
- 我们需要编写一个类用来实现某个需要进行定时执行的任务.
- 创建用于进行调度定时任务调度器.
- 通过
JobBuilder
生成一个任务Job. - 通过
TriggerBuilder
创建一个触发器Trigger. - 将创建的Job实例和Trigger实例加入到调度器Scheduler中.
在编写Demo之前,我们需要先进行一些准备工作:
在Visual Studio中,我们通过NuGet包管理器,需要先安装Quartz包,此处我们安装2.5.0版本,命令如下:
Install-Package Quartz -Version 2.5.0
在下面的示例中,主要需要用到下列三个dll程序集.
- Common.Logging.dll
- Common.Logging.Core.dll
- Quartz.dll
上面的NuGet命令,已经将我们所需要的三个程序集下载到当前项目中.
使用代码方式:
下面是代码示例:
创建某个具体任务实现的作业:
using Quartz;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace QuartzTest
{
/// <summary>
/// 用于演示需要定时执行的任务
/// </summary>
class DemoJob : IJob
{
public void Execute(IJobExecutionContext context)
{
Console.WriteLine(string.Format("Exceute Job : 执行时间:{0}", DateTime.Now.ToString()));
}
}
}
创建某个具体实现的触发器:
using Quartz;
using Quartz.Impl;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace QuartzTest
{
/// <summary>
/// 调度器
/// </summary>
class DemoScheule
{
public static void Start()
{
/*------Demo1 无参数 简单调用的方法 -----------*/
//实例化调度器工厂
ISchedulerFactory schedulefactory = new StdSchedulerFactory();
//通过调度工厂获取一个调度器对象
IScheduler scheduler = schedulefactory.GetScheduler();
//启动调度器
scheduler.Start();
//创建一个定时任务作业
IJobDetail job1 = JobBuilder.Create<DemoJob>().WithIdentity("DemoJob","groupa").Build();
//创建一个触发器
ITrigger trigger1 = TriggerBuilder
.Create()
.WithIdentity("DemoTrigger","groupa")
.StartNow() //设置每五秒执行一次,无限循环执行
.WithSimpleSchedule(u=>u.WithIntervalInSeconds(5).RepeatForever()).Build();
//把定时任务作业,和触发器加入调度器
scheduler.ScheduleJob(job1, trigger1);
}
}
}
调用触发器进行定时任务的执行:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace QuartzTest
{
class Program
{
static void Main(string[] args)
{
//调用调度器
Console.WriteLine("Job Start");
DemoScheule.Start();
Console.ReadKey();
}
}
}
某个具体任务实现的作业(带参数)
using Quartz;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace QuartzTest
{
/// <summary>
/// 用于演示需要定时执行的任务(带参数)
/// </summary>
class DemoJob : IJob
{
public void Execute(IJobExecutionContext context)
{
JobDataMap dataMap = context.JobDetail.JobDataMap;
string str = dataMap.GetString("id"); //调用数据
Console.WriteLine(string.Format("Exceute Job :{0} 执行时间:{1}",str, DateTime.Now.ToString()));
}
}
}
创建某个具体实现的触发器(带参数):
using Quartz;
using Quartz.Impl;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace QuartzTest
{
/// <summary>
/// 调度器
/// </summary>
class DemoScheule
{
public static void Start()
{
/*------Demo1 无参数 简单调用的方法 -----------*/
//实例化调度器工厂
ISchedulerFactory schedulefactory = new StdSchedulerFactory();
//通过调度工厂获取一个调度器对象
IScheduler scheduler = schedulefactory.GetScheduler();
//启动调度器
scheduler.Start();
//创建一个定时任务作业
IJobDetail job1 = JobBuilder
.Create<DemoJob>()
.WithIdentity("DemoJob", "groupa")
.UsingJobData("id","1") //装载数据
.Build();
//创建一个触发器
ITrigger trigger1 = TriggerBuilder
.Create()
.WithIdentity("DemoTrigger","groupa")
.StartNow()
//.WithSimpleSchedule(u=>u.WithIntervalInSeconds(5).RepeatForever()) //设置每五秒执行一次,无限循环执行
.WithSimpleSchedule(u=>u.WithIntervalInSeconds(3).WithRepeatCount(2)) //3秒执行一次执行两次后停止, 开始运行会执行一次
.Build();
//把定时任务作业,和触发器加入调度器
scheduler.ScheduleJob(job1, trigger1);
}
}
}
调用触发器进行定时任务的执行,的过程和上面是一样的.
使用配置方式
上面我们进行任务调度都是通过代码来实现的,当我们要修改歹毒规则的时候,就要重新编译代码这是很不方便的,Quartz .Net 提供了通过配置文件的方式来进行操作.
首先我们在Web.Config或app.Config里面进行配置<Quartz></Quartz>节点的数据.
Quartz在Web.Config或App.Config中块描述.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!--我们需要将Quartz的块配置声明放到startup块的最前面,否则会报错.-->
<configSections>
<!--声明Quzrtz块-->
<section name="Quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
<!--对Quartz块的描述-->
<Quartz>
<add key="quartz.scheduler.instanceName" value="ServerScheduler" />
<add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" />
<add key="quartz.threadPool.threadCount" value="10" />
<add key="quartz.threadPool.threadPriority" value="Normal" />
<add key="quartz.plugin.xml.type" value = "Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz" />
<add key="quartz.plugin.xml.fileNames" value = "quartz_jobs.xml" />
<add key="quartz.jobStore.misfireThreshold" value="60000" />
<add key="quartz.jobStore.type" value="Quartz.Simpl.RAMJobStore, Quartz" />
</Quartz>
</configuration>