zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    stm8s103 EEPROM烧程序时能否保留
    NEC芯片特别说明
    pic中断特别说明
    删除排序链表中的重复元素 II
    被围绕的区域
    计数二进制子串
    简单工厂模式
    打家劫舍 II
    打家劫舍
    相同的树
  • 原文地址:https://www.cnblogs.com/xcsn/p/4390574.html
Copyright © 2011-2022 走看看