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

 

posted @ 2015-04-03 17:07  心存善念  阅读(1896)  评论(0编辑  收藏  举报