当前位置: 代码网 > it编程>编程语言>C# > C#实现Quartz任务调度的示例代码

C#实现Quartz任务调度的示例代码

2024年05月28日 C# 我要评论
使用 quartz.net,你可以很容易地安排任务在应用程序启动时运行,或者每天、每周、每月的特定时间运行,甚至可以基于更复杂的调度规则。官网:http://www.quartz-scheduler.

使用 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;

    }
}

调用示例

// 使用示例  
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任务调度的示例代码的详细内容,更多关于c# quartz任务调度的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com