ABP后台服务之作业调度Quartz.NET
一、简介
Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中。它提供了巨大的灵活性而不牺牲简单性。
你能够用它来为执行一个作业而创建简单的或复杂的调度。
它一些很好的特性:
1:支持集群,作业分组,作业远程管理。
2:自定义精细的时间触发器,使用简单,作业和触发分离。
3:数据库支持,可以寄宿Windows服务,WebSite,winform等。
合适场景:
间隔时间获取数据,每周固定时间获取数据,每个月的最后一天执行等等
官网:https://www.quartz-scheduler.net/
开源地址:https://github.com/quartznet/quartznet
二、ABP后台服务 - 集成Quartz
此部分是abp官方示例解说,地址:https://github.com/ABPFrameWorkGroup/AbpDocument2Chinese/blob/master/Markdown/Abp/7.3ABP后台服务-集成Quartz.md
基础概念
Quartz框架的一些基础概念解释:
Scheduler 作业调度器。
IJob 作业接口,继承并实现Execute, 编写执行的具体作业逻辑。
JobBuilder 根据设置,生成一个详细作业信息(JobDetail)。
TriggerBuilder 根据规则,生产对应的Trigger
1. 安装
安装Abp.Quartz到你的项目,并对你的模块添加 AbpQuartzModule 依赖。
Install-Package Abp.Quartz -Version 1.2.1
如下所示:
[DependsOn(typeof (AbpQuartzModule))]
public class YourModule : AbpModule
{
//...
}
2. 创建后台作业
你也可以实现Quartz的IJob接口来创建一个新的作业,或者派生自JobBase类(定义在Abp.Quartz包中),该类有一些工具属性和方法(例如:日志记录和本地化)。如下所示是一个简单的作业类:
public class MyLogJob : JobBase, ITransientDependency
{
public override void Execute(IJobExecutionContext context)
{
Logger.Info("Executed MyLogJob :)");
}
}
3. 创建调度作业
IQuartzScheduleJobManager 接口被用来创建调度作业。你可以在类中注入该接口(或者你可以在你的模块的PostInitialize方法中解析和使用它)来调度作业。某个包含作业调度的控制器示例:
public class HomeController : AbpController
{
private readonly IQuartzScheduleJobManager _jobManager;
public HomeController(IQuartzScheduleJobManager jobManager)
{
_jobManager = jobManager;
}
public async Task<ActionResult> ScheduleJob()
{
await _jobManager.ScheduleAsync<MyLogJob>(
job =>
{
job.WithIdentity("MyLogJobIdentity", "MyGroup")//
.WithIdentity(
"作业名称"
,
"作业组"
)
.WithDescription("A job to simply write logs.");
},
trigger =>
{
trigger.StartNow()
.WithSimpleSchedule(schedule =>
{
schedule.RepeatForever()
.WithIntervalInSeconds(5)
.Build();
});
});
return Content("OK, scheduled!");
}
}
abp将创建过程进行了轻度的封装,翻译过来源代码大概如下:
public ActionResult ScheduleJob() { //从工厂中获取一个调度器实例化 IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler(); scheduler.Start(); //开启调度器 IJobDetail job1 = JobBuilder.Create<MyLogJob>() //创建一个作业 .WithIdentity("MyLogJobIdentity", "MyGroup") .WithDescription("A job to simply write logs.") .Build(); ITrigger trigger1 = TriggerBuilder.Create() //.WithIdentity("触发器名称", "触发器组") //未指定 .StartNow() .WithSimpleSchedule(x => x .RepeatForever() .WithIntervalInSeconds(5) ) .Build(); scheduler.ScheduleJob(job1, trigger1); //把作业,触发器加入调度器。 return Content("OK, scheduled!"); }
三、深入应用
1.PostInitialize解析
文档中只告诉了我们方法,但是没说怎么做,只能自己摸着石头过河。
在web项目的xxWebModule中做如下修改
public override void PostInitialize() { var workManager = IocManager.Resolve<IQuartzScheduleJobManager>(); workManager.ScheduleAsync<MyLogJob>( ..... ); }
参考:
http://www.cnblogs.com/lzrabbit/archive/2012/04/13/2447609.html 懒惰的肥兔
http://www.cnblogs.com/tommyli/archive/2009/02/09/1386644.html 李占卫(详细)
http://www.cnblogs.com/jys509/p/4628926.html Quartz.NET 入门(推荐)
http://www.cnblogs.com/jys509/p/4614975.html 使用Topshelf创建Windows服务
https://www.cnblogs.com/mushroom/p/4067037.html