ibcadmin 发表于 2019-8-13 17:58:31

控制台基于Quartz.Net组件实现定时任务调度(一)

<p>前言:</p>
<p>   你曾经需要应用执行一个任务吗?比如现在有一个需求,需要每天在零点定时执行一些操作,那应该怎样操作呢?</p>
<p><div align="center"></div></p>
<p>   这个时候,如果你和你的团队是用.NET编程的话,可以考虑使用Quartz.NET调度器。允许开发人员根据日期间隔来实现任务调度任务。非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等。</p>
<p>   Quartz一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植每隔,基于C#写成,可应用于winform、asp.net、asp.net core应用中。提供了巨大的灵活性,是一个更为强大,方便管理,集群部署的作业调度框架。</p>
<p>所以,有时候项目需要在不同时刻,执行一个或很多个不同的作业,你可以用它来完成执行创建简单或复杂的任务调度。</p>
<p>导图:</p>
<p><div align="center"></div></p>
<p>特性:</p>
<p>1:支持集群,作业分组,作业远程管理。 </p>
<p>2:自定义精致的时间触发器,使用简单,作业和触发分离。</p>
<p>3:数据库支持,可以寄宿Windows服务,WebSite,winform等。</p>
<p>概念:</p>
<p>Scheduler      作业调度器</p>
<p><div align="center"></div></p>
<p>所有的scheduler都应该由<code >SchedulerFactory来创建</code></p>

//创建scheduler
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

<p>IJob             作业接口,继承并实现Execute, 编写执行的具体作业逻辑。</p>
<p><div align="center"></div></p>
<p>通过实现IJob接口来使你的.NET组件可以很简单地被scheduler执行</p>

    public class ConsoleJob : IJob
    {
      public Task Execute(IJobExecutionContext context)
      {
            return Console.Out.WriteLineAsync($"执行作业");
      }
    }

<p>JobBuilder       根据设置,生成一个详细作业信息(JobDetail)。</p>
<p>JobBuilder是一个建造者模式,链式建造。通过静态方法构建一个JobBuilder实例,然后再调用类方法Build()创建一个IJobDetail的实现。</p>

public static JobBuilder Create(Type jobType)
{
    JobBuilder b = new JobBuilder();
    b.OfType(jobType);
    return b;
}

<p>TriggerBuilder   根据规则,生产对应的Trigger,触发器可以规划执行任务</p>
<p><div align="center"></div></p>
<p> </p>
<p>通过静态方法构建一个TriggerBuilder实例,然后再调用类方法Build()创建一个ITrigger的实现。</p>

public static TriggerBuilder Create()
{
    return new TriggerBuilder();
}

<p> 根据任务设置触发的开始时间和结束时间</p>

    /// <summary>
    /// 开始时间
    /// </summary>
    /// <param name="startTimeUtc"></param>
    /// <returns></returns>
    public TriggerBuilder StartAt(DateTimeOffset startTimeUtc)
    {
      startTime = startTimeUtc;
      return this;
    }
    /// <summary>
    /// 结束时间
    /// </summary>
    /// <param name="endTimeUtc"></param>
    /// <returns></returns>
    public TriggerBuilder EndAt(DateTimeOffset? endTimeUtc)
    {
      endTime = endTimeUtc;
      return this;
    }

<p>步骤:</p>
<p><div align="center"></div></p>
<p>1、创建一个ISchedulerFactory,然后并且获取 Scheduler</p>
<p>2、启动 Scheduler</p>
<p>3、创建 job 任务</p>
<p>4、创建 trigger 触发器</p>
<p>5、使用触发器规划执行任务</p>
<p>开始:</p>
<p>注意:</p>
<p>新建一个Quartz项目后,需要安装下面的程序包:</p>
<p>你可以用控制台命令的方式安装</p>

Install-Package Quartz

<p>也可以使用下面这种方式选择安装版本</p>
<p><div align="center"></div></p>
<p>一、创建一个scheduler的引用:</p>

            ISchedulerFactory schedFact = new StdSchedulerFactory();
            IScheduler sched = await schedFact.GetScheduler();

<p>二、启动 scheduler:</p>

            await sched.Start();

<p>三、实现IJob:</p>
<p>ConsoleJob.cs 实现IJob,在Execute方法里编写要处理的业务逻辑,系统就会按照Quartz的配置,定时处理</p>

    /// <summary>
    /// 实现IJob,Execute方法里编写要处理的业务逻辑
    /// </summary>
    public class ConsoleJob : IJob
    {
      public Task Execute(IJobExecutionContext context)
      {
            return Console.Out.WriteLineAsync($"ConsoleJob执行工作 在当前时间{DateTime.Now}--上一次执行时间:{DateTime.Now.AddSeconds(-5)}");
      }
    }

<p>四、创建trigger:(建立一个某个时间点的触发器,并且每5秒执行一次)</p>

            ITrigger trigger = TriggerBuilder.Create()
                .WithIdentity("trigger1", "group1")//触发器 组
                .WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever())
                .Build();

<p>五、触发器执行任务:</p>

            await sched.ScheduleJob(job, trigger);

<p>将几个步骤整合子女码如下:</p>

      /// <summary>
      /// 任务调度的使用过程
      /// </summary>
      /// <returns></returns>
      public async static Task Run()
      {
            // 1.创建scheduler的引用
            ISchedulerFactory schedFact = new StdSchedulerFactory();
            IScheduler sched = await schedFact.GetScheduler();
            

            //2.启动 scheduler
            await sched.Start();

            // 3.创建 job
            IJobDetail job = JobBuilder.Create<ConsoleJob>()
                  .WithIdentity("job1", "group1")
                  .Build();

            // 4.创建 trigger (创建 trigger 触发器)
            ITrigger trigger = TriggerBuilder.Create()
                .WithIdentity("trigger1", "group1")//触发器 组
                .WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever())
                .Build();

            // 5.使用trigger规划执行任务job (使用触发器规划执行任务)
            await sched.ScheduleJob(job, trigger);
      }

<p>运行:</p>
<p>间隔5秒执行一次后的效果:</p>
<p><div align="center"></div></p>
<p>附加:</p>
<p>这里使用的quartz为3.x 版本,整个版本相对于2.0版本进行了大量的修改,正式支持了.NET Core 和async/await</p>
<p>引用张队文章的内容:</p>
<p><div align="center"></div></p>
<p>总结:</p>
<p>1.其实在实际项目中,可以将上面的方法进行封装处理,形成不同的任务,特别是处理多任务的时候,在不同的job中调用不同的trigger,后续会继续完善开发</p>
<p>2.quartz还有更多的用法,可以参考资料:Quartz.Net官方文档   和Quartz.Net开源地址</p>
<p>3.项目源码地址</p><br>来源:<a href="https://www.cnblogs.com/i3yuan/p/11332931.html" target="_blank">https://www.cnblogs.com/i3yuan/p/11332931.html</a><br>免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

剑弑 发表于 2019-8-14 10:56:01

楠哥,Quartz.Net不是不支持集群吗?

ibcadmin 发表于 2019-8-14 15:35:54

剑弑 发表于 2019-8-14 10:56
楠哥,Quartz.Net不是不支持集群吗?

我没用过他集群,但是查了下是支持集群的

剑弑 发表于 2019-8-22 11:52:58

ibcadmin 发表于 2019-8-14 15:35
我没用过他集群,但是查了下是支持集群的

页: [1]
查看完整版本: 控制台基于Quartz.Net组件实现定时任务调度(一)