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

  • 相关阅读:
    C++ 根据对象名字创建对象
    Google是如何测试的(一)
    lex yacc 学习
    C语言宏定义时#(井号)和##(双井号)的用法
    更多编译器对C++11的支持比较
    用C++11替代Boost的实验之三
    最先进的开源游戏引擎KlayGE 4.2发布
    各编译器对C++11的支持比较
    在Android模拟器上的一些小陷阱
    推出KlayGE Foundation Library
  • 原文地址:https://www.cnblogs.com/wangqilong/p/12540370.html
Copyright © 2011-2022 走看看