run in this way,   no why,   only for you heart
CSDN博客(点击进入) CSDN
51CTO(点击进入) 51CTO

Quartz 作业调度框架的使用

之前做一个OA项目,多个数据库数据同步,解决方法是用window系统的任务计划定时去执行脚本文件,很不方便,因为脚本文件可能会执行发生异常,需要去服务器调试,最近看到Quartz框架,可以将数据库同步放在OA系统内去定时执行,这样可以方便很多。


Quartz框架目前最新是3.0版本,官网: https://www.quartz-scheduler.net/

Demo:
1.引入Quartz.dll ,可以在官网下载后引入,也可以在VS中NuGet包管理器中引入。
2.简单建立一个控制台项目:

   static void Main(string[] args)
   {
      Console.WriteLine("工作调度开始,当前时间为:"+DateTime.Now.ToString());
      
      //1. 调度器工厂
      ISchedulerFactory factory = new StdSchedulerFactory();

      //2. 创建一个调度器
      Task<IScheduler> taskScheduler = factory.GetScheduler();
      IScheduler scheduler = taskScheduler.Result;

      IJobDetail job = JobBuilder.Create<JobDemo>().Build();
      IJobDetail job2 = JobBuilder.Create<JobDemo2>().Build();

      //3、创建一个触发器
      // 开始执行时间 与 结束时间
      DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddSeconds(1), 2);
      DateTimeOffset endTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddHours(2), 2);

      //DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(DateTime.Now, 1);
      //DateTimeOffset endTime = DateBuilder.NextGivenSecondDate(DateTime.MaxValue.AddDays(-1), 1);

      //每隔 10s 触发一次
      ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create().StartAt(startTime).EndAt(endTime)
                                  .WithCronSchedule("0/10 * * * * ?")
                                  .Build();
      //每隔 3s 触发一次,一百次后结束,这里不规定最大触发次数默认为1次
      ISimpleTrigger trigger2 = (ISimpleTrigger)TriggerBuilder.Create().StartAt(startTime).EndAt(endTime)
                                  .WithSimpleSchedule(x => x.WithIntervalInSeconds(3).WithRepeatCount(100))
                                  .Build();
      
      //4、将任务与触发器添加到调度器中           
      scheduler.ScheduleJob(job, trigger);
      scheduler.ScheduleJob(job2, trigger2);
      
      //5、开始执行
      scheduler.Start();

      Console.ReadKey();
  }

  public class JobDemo : IJob
  {           
      public async Task Execute(IJobExecutionContext context)
      {
          Console.WriteLine(DateTime.Now.ToString()+ " ---Trigger 1---");
      }
  }

  public class JobDemo2 : IJob
  {
      public async Task Execute(IJobExecutionContext context)
      {
          Console.WriteLine(DateTime.Now.ToString() + " ---Trigger 2---");
      }
  }

3.执行结果:
在这里插入图片描述

注意: 在项目中使用IIS发布项目时,需要将程序池的线程回收机制关闭。

源码: https://github.com/wangqilong1225/C-Sharp-Test/tree/master/QuartzDemo

推荐相关博客:
https://www.cnblogs.com/knowledgesea/p/4930469.html (注意是 Quartz 3.0 之前的框架)
https://www.cnblogs.com/shanyou/p/8269641.html (Quartz 3.0 特性)
https://www.cnblogs.com/lihaiming93/p/6619124.html (cronschedule 时间的使用)
http://cron.qqe2.com/

posted @ 2019-08-27 22:06  _小龙人  阅读(98)  评论(0编辑  收藏  举报