• .NET中使用Quartz


    Quartz是一个流行的开源任务调度库,它提供了强大的任务调度功能,可以方便地与.NET应用程序集成。

    Quartz.NET是Quartz的.NET版本,它是为.NET框架编写的,并提供了与.NET应用程序的集成。它支持各种调度策略,包括定时、间隔、日历等,可以灵活地配置和管理任务。

    Quartz.NET具有以下特点:

    1. 开源:Quartz.NET是一个开源项目,可以免费使用和修改。
    2. 稳定性:Quartz.NET具有高可用性和伸缩性,能够应对大规模和关键任务应用场景。
    3. 灵活性:Quartz.NET提供了多种调度策略,可以灵活地配置和管理任务。
    4. 可扩展性:Quartz.NET可以与其他.NET应用程序集成,提供了更高级别的自动化和任务调度功能。
    5. 社区支持:Quartz.NET有着活跃的社区支持,可以方便地找到帮助和资源。

    Quartz.NET的主要组件包括调度器、触发器和作业。调度器是Quartz.NET的核心组件,负责管理和协调任务的执行。触发器定义了任务执行的时间和频率,可以根据需要设置时间表达式。作业是实际执行的任务,可以是任何.NET类和方法。

    Quartz.NET的使用非常灵活,可以通过XML配置文件、代码或依赖注入进行配置和管理。它提供了丰富的API和文档,可以方便地定制和扩展。此外,Quartz.NET还支持多种类型的触发器,包括SimpleTrigger、CronTrigger和CalendarIntervalTrigger等。这些触发器可以根据需要选择,以满足不同的调度需求。

    总之,Quartz.NET是一个功能强大的任务调度库,适用于各种.NET应用程序。它可以提高生产力和效率,减少人工干预和管理成本,为企业级应用提供更高级别的自动化和可扩展性。

    触发器介绍:

    触发器类型一共有4种。

    1、WithSimpleSchedule

    1. ITrigger simpleTrigger = TriggerBuilder.Create()
    2. .WithIdentity("trigger1", "group1")
    3. .WithSimpleSchedule(x => x.WithIntervalInHours(2)
    4. .RepeatForever()
    5. )
    6. .Build();

    指定时间间隔,有WithInterval(TimeSpan)、WithIntervalInHours、WithIntervalInMinutes、WithIntervalInSeconds。

    2、WithDailyTimeIntervalSchedule

    1. ITrigger dailyTimeTrigger = TriggerBuilder.Create()
    2. .WithIdentity("trigger1", "group1")
    3. .WithDailyTimeIntervalSchedule(x => x.OnEveryDay().WithIntervalInSeconds(5)) //5秒执行一次
    4. .Build();

    支持更精确的时间配置,它可以选择每天、周末、工作日、周几,同时指定的时间范围及执行时间周期。

    3、WithCalendarIntervalSchedule

    1. ITrigger calendarTimeTrigger = TriggerBuilder.Create()
    2. .WithIdentity("trigger1", "group1")
    3. .WithCalendarIntervalSchedule(x => x.WithIntervalInSeconds(5)) //5秒执行一次
    4. .Build();

    它可以支持年、月、周、日、时、分、秒及夏令时的设置,可以用于创建一个在指定的时间间隔内重复运行的调度任务。 

    1. Trigger trigger = TriggerBuilder.Create()
    2. .WithIdentity("trigger1", "group1")
    3. .WithCalendarIntervalSchedule(x => x
    4. .WithInterval(TimeSpan.FromDays(1))
    5. .WithAlignToStartTime(true).Build());

     在上面的例子中,我们创建了一个每天都会触发一次的 Trigger。其中 WithInterval 方法设置了调度任务的时间间隔,而 WithAlignToStartTime 则让任务开始时间对齐到开始时间的下一个时间间隔。这样做的目的是避免重复调度。例如,如果设置为每两天执行一次,并且当前是第一天,则下一次执行将在两天后,而不是立即执行。

    4、WithCronSchedule

    1. ITrigger cronTrigger = TriggerBuilder.Create()
    2. .WithIdentity("trigger1", "group1")
    3. .WithCronSchedule("0 0/1 * * * ?")
    4. .UsingJobData("order_no", Guid.NewGuid().ToString())//作业数据传递
    5. .Build();

    使用Cron表达式,一般实际项目中使用的是WithCronSchedule,因为Cron表达式更加灵活、方便。 

    本实列使用抽象工厂设计模式。Quartz的版本为3.0.7.0。

    一、创建调度器添加JOB的接口

    1. namespace QuartzNet.Interface
    2. {
    3. interface ISchedulerAddJob
    4. {
    5. //尽量保证job、group、trigger、order_no的唯一性,避免冲突
    6. void SchedulerAddJob();
    7. }
    8. }

    二、实现IJob接口,指定执行的作业

    1. using BLL;
    2. using Quartz;
    3. using System.Threading.Tasks;
    4. namespace QuartzNet.ExecuteJobWaysImpl
    5. {
    6. public class ExecuteSyncInTime : IJob
    7. {
    8. public Task Execute(IJobExecutionContext context)
    9. {
    10. return Task.Run(() =>
    11. {
    12. //调用无返回值的方法
    13. new Class1().SyncInTime();
    14. });
    15. }
    16. }
    17. }

    三、实现ISchedulerAddJob接口

    1. using Quartz;
    2. using QuartzNet.ExecuteJobWaysImpl;
    3. using QuartzNet.Interface;
    4. using System;
    5. namespace QuartzNet.SchedulerImpl
    6. {
    7. public class SyncInTimeImpl : ISchedulerAddJob
    8. {
    9. IScheduler scheduler;
    10. //1、构造器注入调度器
    11. public SyncInTimeImpl(IScheduler scheduler)
    12. {
    13. this.scheduler = scheduler;
    14. }
    15. public async void SchedulerAddJob()
    16. {
    17. //2、创建一个任务
    18. IJobDetail job = JobBuilder.Create<ExecuteSyncInTime>().WithIdentity("job3", "group3").Build();
    19. //3、创建一个WithSimpleSchedule触发器
    20. ITrigger simpleTrigger = TriggerBuilder.Create()
    21. .WithIdentity("trigger3", "group3")
    22. .WithSimpleSchedule(x => x.WithIntervalInHours(Properties.Settings.Default.JOB3_RUNTIME)
    23. .RepeatForever()
    24. )
    25. .UsingJobData("order_no3", Guid.NewGuid().ToString())//作业数据传递
    26. .Build();
    27. //4、将任务与触发器添加到调度器中
    28. await scheduler.ScheduleJob(job, simpleTrigger);
    29. }
    30. }
    31. }

    四、创建一个调度工厂,用于创建调度器,确保唯一实例

    1. using Quartz;
    2. using Quartz.Impl;
    3. using System.Threading.Tasks;
    4. namespace QuartzNet
    5. {
    6. public class QuartzManage
    7. {
    8. //创建一个调度工厂
    9. public static Task scheduler = GetScheduler();
    10. private async static Task GetScheduler()
    11. {
    12. StdSchedulerFactory stdSchedulerFactory = new StdSchedulerFactory();
    13. IScheduler scheduler = await stdSchedulerFactory.GetScheduler();
    14. return scheduler;
    15. }
    16. }
    17. }

    五、调用SchedulerAddJob方法,创建任务和触发器,并添加到调度器中,可批量调用

    1. public partial class QuartzForm : Form
    2. {
    3. //向上转型,里氏替换原则
    4. private static ISchedulerAddJob schedulerAddJob;
    5. private static IScheduler scheduler;
    6. public QuartzForm ()
    7. {
    8. InitializeComponent();
    9. }
    10. private async void btnStart_Click(object sender, EventArgs e)
    11. {
    12. //唯一调度器
    13. scheduler = await QuartzManage.scheduler;
    14. schedulerAddJob = new SyncInTimeImpl(scheduler);
    15. schedulerAddJob.SchedulerAddJob();
    16. //开始执行
    17. await scheduler.Start();
    18. }
    19. }

    六、关闭、暂停和恢复JOB的方法

    1. //在应用程序关闭时运行的代码
    2. if (scheduler != null)
    3. {
    4. await scheduler.Shutdown(true);
    5. }
    6. //暂停所有job
    7. await scheduler.PauseAll();
    8. //恢复所有job
    9. await scheduler.ResumeAll();

  • 相关阅读:
    C数据结构:树和森林存储方式与遍历方式
    [b01lers2020]Welcome to Earth
    RAID技术复习笔记
    分析报告显示,PHP是编程语言主力军,且在电商领域占据“统治地位”
    【计算机视觉】OpenCV算法解析
    el-table中给每行添加loading效果案例
    蓝桥杯(1):python排序
    DTSE Tech Talk | 第10期:云会议带你入门音视频世界
    一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?
    安科瑞智能母线监控在数据中心的应用
  • 原文地址:https://blog.csdn.net/weixin_50478033/article/details/133137314