.NET中使用Quartz

2023-09-21 17:09:51

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

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

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

2、WithDailyTimeIntervalSchedule

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

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

3、WithCalendarIntervalSchedule

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

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

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

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

4、WithCronSchedule

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

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

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

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

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

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

using BLL;
using Quartz;
using System.Threading.Tasks;

namespace QuartzNet.ExecuteJobWaysImpl
{
    public class ExecuteSyncInTime : IJob
    {
        public Task Execute(IJobExecutionContext context)
        {
            return Task.Run(() =>
            {
                //调用无返回值的方法
                new Class1().SyncInTime();
            });
        }
    }
}

三、实现ISchedulerAddJob接口

using Quartz;
using QuartzNet.ExecuteJobWaysImpl;
using QuartzNet.Interface;
using System;

namespace QuartzNet.SchedulerImpl
{
    public class SyncInTimeImpl : ISchedulerAddJob
    {
        IScheduler scheduler;

        //1、构造器注入调度器
        public SyncInTimeImpl(IScheduler scheduler)
        {
            this.scheduler = scheduler;
        }

        public async void SchedulerAddJob()
        {
            //2、创建一个任务
            IJobDetail job = JobBuilder.Create<ExecuteSyncInTime>().WithIdentity("job3", "group3").Build();

            //3、创建一个WithSimpleSchedule触发器
            ITrigger simpleTrigger = TriggerBuilder.Create()
                                                   .WithIdentity("trigger3", "group3")
                                                   .WithSimpleSchedule(x => x.WithIntervalInHours(Properties.Settings.Default.JOB3_RUNTIME)
                                                                             .RepeatForever()
                                                                       )
                                                   .UsingJobData("order_no3", Guid.NewGuid().ToString())//作业数据传递
                                                   .Build();

            //4、将任务与触发器添加到调度器中
            await scheduler.ScheduleJob(job, simpleTrigger);
        }
    }
}

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

using Quartz;
using Quartz.Impl;
using System.Threading.Tasks;

namespace QuartzNet
{
    public class QuartzManage
    {
        //创建一个调度工厂
        public static Task<IScheduler> scheduler = GetScheduler();

        private async static Task<IScheduler> GetScheduler()
        {
            StdSchedulerFactory stdSchedulerFactory = new StdSchedulerFactory();
            IScheduler scheduler = await stdSchedulerFactory.GetScheduler();
            return scheduler;
        }
    }
}

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

public partial class QuartzForm : Form
{
    //向上转型,里氏替换原则
    private static ISchedulerAddJob schedulerAddJob;
    private static IScheduler scheduler;

    public QuartzForm ()
    {
        InitializeComponent();
    }

    private async void btnStart_Click(object sender, EventArgs e)
    {
        //唯一调度器
        scheduler = await QuartzManage.scheduler;

        schedulerAddJob = new SyncInTimeImpl(scheduler);
        schedulerAddJob.SchedulerAddJob();

        //开始执行
        await scheduler.Start();
    }
}

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

//在应用程序关闭时运行的代码
if (scheduler != null)
{
    await scheduler.Shutdown(true);
}

//暂停所有job
await scheduler.PauseAll();

//恢复所有job
await scheduler.ResumeAll();

更多推荐

基于数据驱动的成本洞察,趣丸科技的FinOps进阶之路~

今年以来,我们注意到越来越多的单位开始积极实践FinOps,而随着FinOps的发展,大家对于其落地过程的关注也更加具体和深入,涉及了账单波动、FinOps的边际效应、成本模型、依赖工具等多个关键问题。本月「UGeek大咖说」线上直播活动,我们邀请到了FinOps实践成熟度非常高的趣丸科技,作为快速发展的互联网公司,趣

功能基础篇2——常用哈希和加密算法介绍及Python相关库与实现

加解密https://docs.python.org/3/library/crypto.html三方库推荐,https://cryptography.io/en/latest/Criptography,https://pypi.org/project/cryptography/PyCryptodome,aforkofP

月木学途开发 6.网址模块

概述效果图数据库设计网站类型表DROPTABLEIFEXISTS`website`;CREATETABLE`website`(`websiteId`int(11)NOTNULLAUTO_INCREMENT,`websiteImg`longtext,`websiteName`varchar(255)DEFAULTNULL

嵌入式Linux驱动开发(I2C专题)(七)

使用GPIO操作I2C设备_IMX6ULL参考资料:Linux文档Linux-5.4\Documentation\devicetree\bindings\i2c\i2c-gpio.yamlLinux-4.9.88\Documentation\devicetree\bindings\i2c\i2c-gpio.txtLin

Selenium-介绍下其他骚操作

ChromeDevTools简介ChromeDevTools是一组直接内置在基于Chromium的浏览器(如Chrome、Opera和MicrosoftEdge)中的工具,用于帮助开发人员调试和研究网站。借助ChromeDevTools,开发人员可以更深入地访问网站,并能够:检查DOM中的元素即时编辑元素和CSS检查和

【Java 基础篇】Java UDP通信详解

UDP(UserDatagramProtocol)是一种无连接的网络传输协议,它不像TCP那样需要建立连接和维护状态,因此更加轻量级。UDP适用于那些对数据传输的实时性要求较高,可以容忍一定数据丢失的场景。本文将详细介绍Java中如何使用UDP协议进行网络通信,包括UDP套接字、数据传输、服务器和客户端的创建等。1.U

云可观测性:提升云环境中应用程序可靠性

随着云计算的兴起和广泛应用,越来越多的企业将其应用程序和服务迁移到云环境中。在这个高度动态的环境中,确保应用程序的可靠性和可管理性成为了一个迫切的需求。云可观测性作为一种解决方案,针对这一需求提供了有效的方法和工具。本文将介绍云可观测性的概念、优势以及它如何提升云环境中应用程序的可靠性和可管理性。一、云可观测性概述掌动

ADB环境搭建和抓取Crash日志实践总结

一、adb下载1.1直接点击下载即可:http://adbshell.com/upload/adb.zip1.2网盘获取链接:https://pan.baidu.com/s/1P9nlRN0RQhPCPDaYg7Cgrg提取码:deng下载到本地解压,双击下图应用程序进行安装,其他文件不用动(与普通应用程序不同,adb

人工智能:ChatGPT与其他同类产品的优缺点对比

引言:自然语言处理技术的快速发展推动了聊天机器人的广泛应用。ChatGPT作为一种强大的语言模型,具有出色的生成能力和上下文理解能力。本文将对比ChatGPT与其他同类产品的优缺点,并展示使用ChatGPT进行对话生成的示例代码。ChatGPT简介ChatGPT是由OpenAI开发的语言模型,基于大规模的预训练数据和深

K8S pod资源、探针

目录一.pod资源限制1.pod资源限制方式2.pod资源限制指定时指定的参数(1)request资源(2)limit资源(3)两种资源匹配方式3.资源限制的示例(1)官网示例2)Pod和容器的资源请求和限制格式(3)CPU资源单位介绍(4)内存资源单位(5)资源限制示例1:(6)资源限制示例2:2.Probe支持三种

模式分类与“组件协作模式”

1.GOF-23模式分类从目的来看:创建型(Creational)模式:将对象的部分创建工作延迟到子类或者其他对象,从而应对需求变化为对象创建时具体类型实现引来的冲击。结构型(Structural)模式:通过类继承或者对象组合获得更灵活的结构,从而应对需求变化为对象的结构带来的冲击。行为型(Behavioral)模式:

热文推荐