c# 实现Quartz任务调度

这篇具有很好参考价值的文章主要介绍了c# 实现Quartz任务调度。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用 Quartz.NET,你可以很容易地安排任务在应用程序启动时运行,或者每天、每周、每月的特定时间运行,甚至可以基于更复杂的调度规则。

官网:http://www.quartz-scheduler.net/

实现任务类

创建一个实现了 IJob 接口的类(MailJobTest),该接口包含一个 Execute 方法,该方法将在作业运行时调用。例如:

using Quartz;
using System;
using System.Threading.Tasks;
using UploadLogiData.Util;

namespace UploadLogiData
{
    /// <summary>
    /// 邮件任务测试(每天三点固定时间检测Logi数据并发送内部邮件)
    /// </summary>
    //对于耗时任务,需要上一次执行完成后,才执行下次任务,覆盖之前设置的执行周期
    [DisallowConcurrentExecution]
    public class MailJobTest : IJob
    {
        public async Task Execute(IJobExecutionContext context)
        {
            try
            {
                DisplayListboxMsg("邮箱开始调度");

            } catch (Exception ex)
            {  
                UpUtil.LogWrite("ExceptionLog",$"定时器异常_{ex.StackTrace}");
            }
        }
    }
}

实现一个LogiDownloadJob任务类

using MechTE_480.DateTimeCategory;
using Quartz;
using System;
using System.Threading.Tasks;
using UploadLogiData.Util;

namespace UploadLogiData.Quartzs
{
    /// <summary>
    /// 监听启动时间,执行任务下载logi数据
    /// </summary>
    //对于耗时任务,需要上一次执行完成后,才执行下次任务,覆盖之前设置的执行周期
    [DisallowConcurrentExecution]
    public class LogiDownloadJob : IJob
    {
        public async Task Execute(IJobExecutionContext context)
        {
            DisplayListboxMsg("启动时间开始调度");
        }
    }
}

启动调度

实例化并启动调度程序,并调度要执行的作业:

IScheduler scheduler1;
/// <summary>
/// 执行任务调度
/// </summary>
/// <returns></returns>
public async Task ExLogiQuartz()
{
    DisplayListboxMsg("检测任务启动!");
    //1、创建一个调度
    var factory = new StdSchedulerFactory();
    var scheduler = await factory.GetScheduler();
    await scheduler.Start();

    //2、创建一个任务
    var job = JobBuilder.Create<LogiDownloadJob>()
        .WithIdentity("LogiJob","LogiGroup")
        .Build();
    //3、创建一个触发器
    var trigger = TriggerBuilder.Create()
        .WithIdentity("LogiTrigger","LogiTriggerGroup")
        .WithCronSchedule("0/5 * * * * ?")     //5秒执行一次
        .Build();
    await scheduler.ScheduleJob(job,trigger);

    // 第二个任务
    var job2 = JobBuilder.Create<MailJobTest>()
       .WithIdentity("MailJob","MailGroup")
       .Build();
    //3、创建一个触发器
    var trigger2 = TriggerBuilder.Create()
        .WithIdentity("MailTrigger","MailTriggerGroup")
        .WithCronSchedule("0/5 * * * * ?")     //5秒执行一次
        .Build();
    await scheduler.ScheduleJob(job2,trigger2);

    scheduler1 = scheduler; // 对象赋值
}

为作业指定身份:

var job = JobBuilder.Create<SimpleJob>()
        .WithIdentity("LogiJob","LogiGroup") // // 作业名称为 "LogiJob",组名为 "LogiGroup"  
        .Build();

为触发器指定身份:

ITrigger trigger = TriggerBuilder.Create()  
    .WithIdentity("myTrigger", "myTriggerGroup") // 触发器名称为 "myTrigger",组名为 "myTriggerGroup"  
    .StartNow()  
    .WithSimpleSchedule(x => x.WithIntervalInHours(1).RepeatForever())  
    .Build();

创建第二个任务:

 // 创建并调度第二个作业  
 // 第二个任务
 var job2 = JobBuilder.Create<MailJobTest>()
    .WithIdentity("MailJob","MailGroup")
    .Build();
 //3、创建一个触发器
 var trigger2 = TriggerBuilder.Create()
     .WithIdentity("MailTrigger","MailTriggerGroup")
     .WithCronSchedule("0/5 * * * * ?")     //5秒执行一次
     .Build();
 await scheduler.ScheduleJob(job2,trigger2);
  
    // 可以继续添加更多的作业和触发器...  

重要性

  • 唯一性:确保每个作业和触发器在调度器中具有唯一的标识,从而避免冲突。
  • 组织性:通过组名,可以将相关的作业或触发器组织在一起,便于管理。
  • 灵活性:通过使用不同的组,可以轻松地启用、禁用或删除一组相关的作业或触发器。
  • 查询和更新:有了明确的身份标识,可以更容易地查询作业或触发器的状态,或者对其进行更新。

取消任务调度

// 关闭
scheduler1.Shutdown().Wait();
 //方法外部访问调度器实例
IScheduler scheduler1;
 public async void ExQuartz()
 {
     DisplayListboxMsg("检测任务启动!");
     //1、创建一个调度
     var factory = new StdSchedulerFactory();
     var scheduler = await factory.GetScheduler();
     await scheduler.Start();
     //2、创建一个任务
     var job = JobBuilder.Create<SimpleJob>()
         .WithIdentity("job1","group1")
         .Build();
     //3、创建一个触发器
     var trigger = TriggerBuilder.Create()
         .WithIdentity("trigger1","group1")
         .WithCronSchedule("0/2 * * * * ?")     //5秒执行一次
         .Build();
     await scheduler.ScheduleJob(job,trigger);

     scheduler1 = scheduler; // 对象赋值
  
 }

把ExQuartz封装到类里面

ExLogiQuartz方法示例,同时考虑了scheduler的存储和访问:

QuartzScheduler类中

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

namespace UploadLogiData.Quartzs
{

    /// <summary>
    /// 封装了ExLogiQuartz方法和对scheduler的访问
    /// </summary>
    public class QuartzScheduler
    {
        /// <summary>
        /// 方法外部访问调度器实例
        /// </summary>
        IScheduler logiScheduler;

        //先静态定义一下主窗体
        public static Form1 form;

        public async Task ExLogiQuartz()
        {
            form.DisplayListboxMsg("检测任务启动!");
            // 创建一个调度器实例  
            var factory = new StdSchedulerFactory();
            logiScheduler = await factory.GetScheduler();
            await logiScheduler.Start();

            // 创建一个任务:LogiDownloadJob,每5秒执行一次  
            var job = JobBuilder.Create<LogiDownloadJob>()
                .WithIdentity("LogiJob","LogiGroup")
                .Build();
            var trigger = TriggerBuilder.Create()
                .WithIdentity("LogiTrigger","LogiTriggerGroup")
                .WithCronSchedule("0/5 * * * * ?") // 5秒执行一次  
                .Build();
            await logiScheduler.ScheduleJob(job,trigger);

            // 创建第二个任务:MailJobTest,每天下午3点10分执行一次  
            var job2 = JobBuilder.Create<MailJobTest>()
                .WithIdentity("MailJob","MailGroup")
                .Build();
            var trigger2 = TriggerBuilder.Create()
                .WithIdentity("MailTrigger","MailTriggerGroup")
                .WithCronSchedule("0 10 15 * * ?") // 每天下午3点10分执行一次  
                .Build();
            await logiScheduler.ScheduleJob(job2,trigger2);

            // 如果需要在其他地方访问scheduler,可以通过类属性或方法获取  
        }
        public IScheduler Scheduler => logiScheduler;

    }
}

调用示例文章来源地址https://www.toymoban.com/news/detail-847617.html

// 使用示例  
public class Program  
{  
    public static async Task Main(string[] args)  
    {  
        var quartzScheduler = new QuartzScheduler();  
        await quartzScheduler.ExLogiQuartz();  
        
        // 如果需要在其他地方访问scheduler,可以通过以下方式获取  
        var scheduler = quartzScheduler.Scheduler;  
      
        // 如调用关闭
        quartzScheduler.Scheduler.Shutdown().Wait();
        // 其他逻辑...  
    }  
}

到了这里,关于c# 实现Quartz任务调度的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【后端-Quartz】Springboot整合Quartz支持集群环境-设计业务与框架分离及实现定时任务调度

    我们的各个服务需要改造支持集群,现在的授权、日程使用的是基于内存的spring scheduler定时任务,如果部署多个节点,那么到了时间点,多个节点都会开始执行定时任务从而可能引起业务和性能上的问题。 服务中的定时任务比较轻量,为了避免引入redis、zookeeper、单独的定时

    2023年04月09日
    浏览(30)
  • 分布式任务调度(00)--Quartz

    调度器 :工厂类创建Scheduler,根据触发器定义的时间规则调度任务 任务:Job表示被调度的任务 触发器:Trigger 定义调度时间的元素,按啥时间规则执行任务。一个Job可被多个Trigger关联,但是一个Trigger 只能关联一个Job 执行任务调度核心类QuartzSchedulerThread: 调度线程从JobSt

    2024年02月05日
    浏览(41)
  • 分布式定时任务调度框架Quartz

    Quartz是一个定时任务调度框架,比如你遇到这样的问题: 比如淘宝的待支付功能,后台会在你生成订单后24小时后,查看订单是否支付,未支付则取消订单 比如vip的每月自动续费功能 … 想定时在某个时间,去做某件事 Quartz是一套轻量级的任务调度框架,只需要定义了 Job(

    2024年02月04日
    浏览(37)
  • ASP.NET Core MVC+Quartz实现定时任务可视化管理页面

    在前一篇文章,我们了解了如何通过.NET6+Quartz开发基于控制台应用程序的定时任务,今天继续在之前的基础上,进一步讲解基于ASP.NET Core MVC+Quartz实现定时任务的可视化管理页面,仅供学习分享使用,如有不足之处,还请指正。 Quartz组件,关于Quartz组件的基本介绍,可参考前

    2024年02月01日
    浏览(36)
  • Quartz.Net调度框架简介

    Quartz.Net是一个功能强大的开源任务调度框架,它可以在C#应用程序中实现灵活、可靠的任务调度和定时作业。它的主要作用是允许开发人员按照预定的时间表执行各种任务,例如定期生成报表、发送电子邮件、备份数据等。 在C#中使用Quartz.Net进行配置、开发和部署的步骤如下

    2024年02月09日
    浏览(27)
  • Quartz.NET,强大的开源作业调度框架

    Quartz.NET是一个强大的开源作业调度框架,专为C#和.NET开发而设计。它允许开发人员在应用程序中调度、执行和管理各种类型的作业,例如定时任务、后台作业、周期性作业等。Quartz.NET具有高度可配置性和灵活性,可以满足各种复杂的调度需求。 **作用:** Quartz.NET的作用在于

    2024年02月09日
    浏览(36)
  • Quartz:老而弥坚的开源任务调度框架,用起来够丝滑

    大家好,我是二哥呀。定时任务的应用场景其实蛮常见的,比如说: 数据备份 订单未支付则自动取消 定时爬取数据 定时推送信息 定时发布文章 等等(想不出来了,只能等等来凑,😆,反正只要等的都需要定时,怎么样,这波圆场可以吧) 编程喵🐱实战项目里需要做一个

    2023年04月13日
    浏览(25)
  • C#--使用Quartz实现定时任务

    Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等。 Quartz.NET允许开发人员根据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。整合了Quartz.NET的应

    2024年02月08日
    浏览(25)
  • 【SpringBoot】83、SpringBoot集成Quartz实现调度日志收集

    1、Quartz简介 Quartz 是一个开源的作业调度框架,它完全由 Java 写成,并设计用于 J2SE 和 J2EE 应用中。它提供了巨大的灵 活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。它有很多特征,如:数据库支持,集群,插件,EJB 作业预构 建,JavaMail 及

    2024年02月11日
    浏览(51)
  • .NET中使用Quartz

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

    2024年02月07日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包