Quartz.Net使用教程
在项目的开发过程中,难免会遇见后需要后台处理的任务,例如定时发送邮件通知、后台处理耗时的数据处理等,这个时候你就需要Quartz.Net
了。
Quartz.Net
是纯净的,它是一个.Net程序集,是非常流行的Java作业调度系统Quartz的C#实现。
Quartz.Net
一款功能齐全的任务调度系统,从小型应用到大型企业级系统都能适用。功能齐全体现在触发器的多样性上面,即支持简单的定时器,也支持Cron表达式;即能执行重复的作业任务,也支持指定例外的日历;任务也可以是多样性的,只要继承IJob接口即可。
对于小型应用,Quartz.Net
可以集成到你的系统中,对于企业级系统,它提供了Routing支持,提供了Group来组织和管理任务,此外还有持久化、插件功能、负载均衡和故障迁移等满足不同应用场景的需要。
Hello Quartz.Net
开始使用一个框架,和学习一门开发语言一样,最好是从Hello World程序开始。
首先创建一个示例程序,然后添加Quartz.Net的引用。
Install-Package Quartz -Version 3.0.7
我们使用的是当前最新版本3.0.7进行演示。添加引用以后,来创建一个Job类HelloQuartzJob
。
public class HelloQuartzJob : IJob
{
public Task Execute(IJobExecutionContext context){
return Task.Factory.StartNew(() =>
{
Console.WriteLine("Hello Quartz.Net");
});
}
}
这是个非常简单的Job类,它在执行时输出文本Hello Quartz.Net
。
接下来,我们在程序启动时创建调度器(Scheduler),并添加HelloQuartzJob的调度:
static async Task MainAsync()
{
var schedulerFactory = new StdSchedulerFactory();
var scheduler = await schedulerFactory.GetScheduler();
await scheduler.Start();
Console.WriteLine($"任务调度器已启动");
//创建作业和触发器
var jobDetail = JobBuilder.Create().Build();var trigger = TriggerBuilder.Create()
.WithSimpleSchedule(m => {
m.WithRepeatCount(3).WithIntervalInSeconds(1);
})
.Build();//添加调度await scheduler.ScheduleJob(jobDetail, trigger);
}
然后运行程序,你会看到如下图:
通过演示可以看出,要执行一个定时任务,一般需要四步:
创建任务调度器。调度器通常在应用程序启动时创建,一个应用程序实例通常只需要一个调度器即可。
创建Job和JobDetail。Job是作业的类型,描述了作业是如何执行的,这个类是由我们定义的;JobDetail是Quartz对作业的封装,它包含Job类型,以及Job在执行时用到的数据,还包括是否要持久化、是否覆盖已存在的作业等选项。
创建触发器。触发器描述了在何时执行作业。
添加调度。当完成以上三步以后,就可以对作业进行调度了。
作业:Job和JobDetail
Job是作业的类型,描述了作业是如何执行的,这个类型是由我们定义的,例如上文的HelloQuartzJob
。Job实现IJob接口,而IJob接口只有一个Execute
方法,参数context
中包含了与当前上下文中关联的Scheduler、JobDetail、Trigger等。
一个典型的Job定义如下:
public class HelloQuartzJob : IJob
{
public Task Execute(IJobExecutionContext context){
return Task.Factory.StartNew(() =>
{
Console.WriteLine("Hello Quartz.Net");
});
}
}
JobData
Job不是孤立存在的,它需要执行的参数,这些参数如何传递进来呢?我们来定义一个Job类进行演示。
public class SayHelloJob : IJob
{
public string UserName { get; set; }
public Task