翼度科技»论坛 编程开发 .net 查看内容

c# 实现Quartz任务调度

9

主题

9

帖子

27

积分

新手上路

Rank: 1

积分
27
使用 Quartz.NET,你可以很容易地安排任务在应用程序启动时运行,或者每天、每周、每月的特定时间运行,甚至可以基于更复杂的调度规则。
官网:http://www.quartz-scheduler.net/
实现任务类

创建一个实现了 IJob 接口的类(MailJobTest),该接口包含一个 Execute 方法,该方法将在作业运行时调用。例如:
  1. using Quartz;
  2. using System;
  3. using System.Threading.Tasks;
  4. using UploadLogiData.Util;
  5. namespace UploadLogiData
  6. {
  7.     /// <summary>
  8.     /// 邮件任务测试(每天三点固定时间检测Logi数据并发送内部邮件)
  9.     /// </summary>
  10.     //对于耗时任务,需要上一次执行完成后,才执行下次任务,覆盖之前设置的执行周期
  11.     [DisallowConcurrentExecution]
  12.     public class MailJobTest : IJob
  13.     {
  14.         public async Task Execute(IJobExecutionContext context)
  15.         {
  16.             try
  17.             {
  18.                 DisplayListboxMsg("邮箱开始调度");
  19.             } catch (Exception ex)
  20.             {  
  21.                 UpUtil.LogWrite("ExceptionLog",$"定时器异常_{ex.StackTrace}");
  22.             }
  23.         }
  24.     }
  25. }
复制代码
实现一个LogiDownloadJob任务类
  1. using MechTE_480.DateTimeCategory;
  2. using Quartz;
  3. using System;
  4. using System.Threading.Tasks;
  5. using UploadLogiData.Util;
  6. namespace UploadLogiData.Quartzs
  7. {
  8.     /// <summary>
  9.     /// 监听启动时间,执行任务下载logi数据
  10.     /// </summary>
  11.     //对于耗时任务,需要上一次执行完成后,才执行下次任务,覆盖之前设置的执行周期
  12.     [DisallowConcurrentExecution]
  13.     public class LogiDownloadJob : IJob
  14.     {
  15.         public async Task Execute(IJobExecutionContext context)
  16.         {
  17.             DisplayListboxMsg("启动时间开始调度");
  18.         }
  19.     }
  20. }
复制代码
启动调度

实例化并启动调度程序,并调度要执行的作业:
  1. IScheduler scheduler1;
  2. /// <summary>
  3. /// 执行任务调度
  4. /// </summary>
  5. /// <returns></returns>
  6. public async Task ExLogiQuartz()
  7. {
  8.     DisplayListboxMsg("检测任务启动!");
  9.     //1、创建一个调度
  10.     var factory = new StdSchedulerFactory();
  11.     var scheduler = await factory.GetScheduler();
  12.     await scheduler.Start();
  13.     //2、创建一个任务
  14.     var job = JobBuilder.Create<LogiDownloadJob>()
  15.         .WithIdentity("LogiJob","LogiGroup")
  16.         .Build();
  17.     //3、创建一个触发器
  18.     var trigger = TriggerBuilder.Create()
  19.         .WithIdentity("LogiTrigger","LogiTriggerGroup")
  20.         .WithCronSchedule("0/5 * * * * ?")     //5秒执行一次
  21.         .Build();
  22.     await scheduler.ScheduleJob(job,trigger);
  23.     // 第二个任务
  24.     var job2 = JobBuilder.Create<MailJobTest>()
  25.        .WithIdentity("MailJob","MailGroup")
  26.        .Build();
  27.     //3、创建一个触发器
  28.     var trigger2 = TriggerBuilder.Create()
  29.         .WithIdentity("MailTrigger","MailTriggerGroup")
  30.         .WithCronSchedule("0/5 * * * * ?")     //5秒执行一次
  31.         .Build();
  32.     await scheduler.ScheduleJob(job2,trigger2);
  33.     scheduler1 = scheduler; // 对象赋值
  34. }
复制代码
为作业指定身份:
  1. var job = JobBuilder.Create<SimpleJob>()
  2.         .WithIdentity("LogiJob","LogiGroup") // // 作业名称为 "LogiJob",组名为 "LogiGroup"  
  3.         .Build();
复制代码
为触发器指定身份:
  1. ITrigger trigger = TriggerBuilder.Create()  
  2.     .WithIdentity("myTrigger", "myTriggerGroup") // 触发器名称为 "myTrigger",组名为 "myTriggerGroup"  
  3.     .StartNow()  
  4.     .WithSimpleSchedule(x => x.WithIntervalInHours(1).RepeatForever())  
  5.     .Build();
复制代码
创建第二个任务:
  1. // 创建并调度第二个作业  
  2. // 第二个任务
  3. var job2 = JobBuilder.Create<MailJobTest>()
  4.     .WithIdentity("MailJob","MailGroup")
  5.     .Build();
  6. //3、创建一个触发器
  7. var trigger2 = TriggerBuilder.Create()
  8.      .WithIdentity("MailTrigger","MailTriggerGroup")
  9.      .WithCronSchedule("0/5 * * * * ?")     //5秒执行一次
  10.      .Build();
  11. await scheduler.ScheduleJob(job2,trigger2);
  12.   
  13.     // 可以继续添加更多的作业和触发器...  
复制代码
重要性

  • 唯一性:确保每个作业和触发器在调度器中具有唯一的标识,从而避免冲突。
  • 组织性:通过组名,可以将相关的作业或触发器组织在一起,便于管理。
  • 灵活性:通过使用不同的组,可以轻松地启用、禁用或删除一组相关的作业或触发器。
  • 查询和更新:有了明确的身份标识,可以更容易地查询作业或触发器的状态,或者对其进行更新。
取消任务调度
  1. // 关闭
  2. scheduler1.Shutdown().Wait();
复制代码
  1. //方法外部访问调度器实例
  2. IScheduler scheduler1;
  3. public async void ExQuartz()
  4. {
  5.      DisplayListboxMsg("检测任务启动!");
  6.      //1、创建一个调度
  7.      var factory = new StdSchedulerFactory();
  8.      var scheduler = await factory.GetScheduler();
  9.      await scheduler.Start();
  10.      //2、创建一个任务
  11.      var job = JobBuilder.Create<SimpleJob>()
  12.          .WithIdentity("job1","group1")
  13.          .Build();
  14.      //3、创建一个触发器
  15.      var trigger = TriggerBuilder.Create()
  16.          .WithIdentity("trigger1","group1")
  17.          .WithCronSchedule("0/2 * * * * ?")     //5秒执行一次
  18.          .Build();
  19.      await scheduler.ScheduleJob(job,trigger);
  20.      scheduler1 = scheduler; // 对象赋值
  21.   
  22. }
复制代码
把ExQuartz封装到类里面

ExLogiQuartz方法示例,同时考虑了scheduler的存储和访问:
QuartzScheduler类中
  1. using Quartz;
  2. using Quartz.Impl;
  3. using System.Threading.Tasks;
  4. namespace UploadLogiData.Quartzs
  5. {
  6.     /// <summary>
  7.     /// 封装了ExLogiQuartz方法和对scheduler的访问
  8.     /// </summary>
  9.     public class QuartzScheduler
  10.     {
  11.         /// <summary>
  12.         /// 方法外部访问调度器实例
  13.         /// </summary>
  14.         IScheduler logiScheduler;
  15.         //先静态定义一下主窗体
  16.         public static Form1 form;
  17.         public async Task ExLogiQuartz()
  18.         {
  19.             form.DisplayListboxMsg("检测任务启动!");
  20.             // 创建一个调度器实例  
  21.             var factory = new StdSchedulerFactory();
  22.             logiScheduler = await factory.GetScheduler();
  23.             await logiScheduler.Start();
  24.             // 创建一个任务:LogiDownloadJob,每5秒执行一次  
  25.             var job = JobBuilder.Create<LogiDownloadJob>()
  26.                 .WithIdentity("LogiJob","LogiGroup")
  27.                 .Build();
  28.             var trigger = TriggerBuilder.Create()
  29.                 .WithIdentity("LogiTrigger","LogiTriggerGroup")
  30.                 .WithCronSchedule("0/5 * * * * ?") // 5秒执行一次  
  31.                 .Build();
  32.             await logiScheduler.ScheduleJob(job,trigger);
  33.             // 创建第二个任务:MailJobTest,每天下午3点10分执行一次  
  34.             var job2 = JobBuilder.Create<MailJobTest>()
  35.                 .WithIdentity("MailJob","MailGroup")
  36.                 .Build();
  37.             var trigger2 = TriggerBuilder.Create()
  38.                 .WithIdentity("MailTrigger","MailTriggerGroup")
  39.                 .WithCronSchedule("0 10 15 * * ?") // 每天下午3点10分执行一次  
  40.                 .Build();
  41.             await logiScheduler.ScheduleJob(job2,trigger2);
  42.             // 如果需要在其他地方访问scheduler,可以通过类属性或方法获取  
  43.         }
  44.         public IScheduler Scheduler => logiScheduler;
  45.     }
  46. }
复制代码
调用示例
  1. // 使用示例  
  2. public class Program  
  3. {  
  4.     public static async Task Main(string[] args)  
  5.     {  
  6.         var quartzScheduler = new QuartzScheduler();  
  7.         await quartzScheduler.ExLogiQuartz();  
  8.         
  9.         // 如果需要在其他地方访问scheduler,可以通过以下方式获取  
  10.         var scheduler = quartzScheduler.Scheduler;  
  11.       
  12.         // 如调用关闭
  13.         quartzScheduler.Scheduler.Shutdown().Wait();
  14.         // 其他逻辑...  
  15.     }  
  16. }
复制代码
来源:https://www.cnblogs.com/ouyangkai/p/18128298
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
来自手机

举报 回复 使用道具