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;}
}

调用示例

// 使用示例  
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();// 其他逻辑...  }  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/816963.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

乐观锁与悲观锁如何实现?

本文主要是对【MySQL中Update语句是悲观锁&#xff1f;还是乐观锁&#xff1f;】中提到乐观锁与悲观锁的补充。 在 MySQL中&#xff0c;悲观锁是需要依靠数据库提供的锁机制实现的&#xff0c;在 InnoDB 引擎中&#xff0c;使用悲观锁&#xff0c;就需要先关闭 MySQL 数据库的自…

【noVNC】使用noVNC实现浏览器远程VNC(基于web的远程桌面)

一、操作的环境 windows 10系统乌班图 Ubuntu 22 二、noVNC 部署方式 原理&#xff1a;开启 Websockify 代理来做 WebSocket 和 TCP Socket 之间的转换 2.1 noVNC和VNC服务端同一台机器 使用方式&#xff0c;查看另一篇博文 &#xff1a;【noVNC】使用noVNC实现浏览器网页访…

双向链表的实现(详解)

目录 前言初始化双向链表的结构为双向链表的节点开辟空间头插尾插打印链表尾删头删查找指定位置之后的插入删除pos节点销毁双向链表 前言 链表的分类&#xff1a; 带头 不带头 单向 双向 循环 不循环 一共有 (2 * 2 * 2) 种链表 带头指的是&#xff1a;带有哨兵位节点 哨兵位&a…

基于springboot实现人事管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现人事管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;作为学校以及一些培训机构&#xff0c;都在用信息化战术来部署线上学习以及线上考试&#xff0c;可以与线下的考试有机的结合在一起&#xff0c;实现基于vue的人事系统在技术…

numpy学习笔记(3),数组连接

6. 连接数组 6.1. 连接数组&#xff0c; 6.2. 分割数组&#xff0c; 6.3. 算术运算&#xff0c; 6.4. 广播&#xff08;重点&#xff09; 6.1 连接数组 concatenatehstackvstack 6.1.1 使用concatenate函数 沿指定轴连接多个数组&#xff0c;语法格式如下&#xff1a; num…

Linux:调试器 - gdb

Linux&#xff1a;调试器 - gdb gbd基本概念gbd调试浏览断点运行变量 gbd基本概念 GDB (GNU Debugger) 是一个强大的命令行调试工具,用于调试各种编程语言(如C、C、Java、Python等)编写的程序。使用 gdb可以帮助开发人员更快地定位和修复程序中的缺陷,提高代码质量和开发效率。…

软考 - 系统架构设计师 - ETL工具

概念 ETL 工具是一种用于将数据从源系统中提取、进行转换和加载到目标系统中的软件工具&#xff08;数据迁移工具&#xff09;。它们在数据仓库和商业智能项目中起到至关重要的作用。 ETL 的主要步骤 ETL 过程包括数据抽取&#xff08;Extract&#xff09;、数据转换&#xff…

二叉树经典OJ题(2)

一、根据二叉树创建字符串 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public://前序遍历&#xff1a;根 左 右//左子树为空&#xff0c;右子树不为空的时候&#xff0c;不能省略左//左不为空&#xff0c;右子树为空的时候&#xff0c;可以省略右//都为空&am…

Java基于微信小程序的校园外卖平台设计与实现,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

SpringBoot 封装Http请求

1.引入jar包 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.10</version></dependency> 2.HttpUtils操作类封装 package com.gnss.gis.utils;import com.gnss…

MySQL 知识目录

MySQL 知识相关目录主要参考尚硅谷 宋红康老师的视屏&#xff0c;参考链接为 尚硅谷MySQL入门到高级-宋红康版_哔哩哔哩_bilibili 1、基础篇 数据库概述 链接&#xff1a;数据库概述-CSDN博客基本的select语句 链接&#xff1a;基本的select语句-CSDN博客mysql 运算符 链接&a…

一文读懂Vue中的el-dialog(附Demo)

目录 前言1. 基本知识2. Demo 前言 原先对于该知识点写过一个Demo&#xff0c;推荐阅读&#xff1a;点击按钮框来选择相应信息&#xff08;Vue Java&#xff09; 1. 基本知识 el-dialog 是 Element UI 框架中的一个组件&#xff0c;用于创建对话框 提供了丰富的功能和选项…

Day8-Python基础学习之地图和柱状图构建

构建地图 # 地图可视化基本使用 from pyecharts.charts import Map from pyecharts.options import * ​ # 准备地图对象 map Map() # 准备数据 data [("北京市", 99),("上海市", 199),("湖南省", 299),("台湾省", 399),("广东…

积分学<4>——定积分的性质

索引 定积分的性质远算性质定理4.1 定积分的线性性定理4.2 定积分的乘积可积性定理4.3 定积分的保序性定理4.4 定积分的绝对可积性定理4.5 定积分的区间可加性 积分中值定理积分第一中值定理 定积分的性质 远算性质 定理4.1 定积分的线性性 若函数 f ( x ) f\left ( x \righ…

Leetcode 3117. Minimum Sum of Values by Dividing Array

Leetcode 3117. Minimum Sum of Values by Dividing Array 1. 解题思路2. 代码实现 题目链接&#xff1a;3117. Minimum Sum of Values by Dividing Array 1. 解题思路 这一题思路上就是一个动态规划&#xff0c;我们只需要考察每一个元素是否需要放在当前的group当中还是作…

使用Python爬虫代理IP快速增加博客阅读量

目录 前言 二、Python爬虫代理IP技术简介 1.什么是爬虫&#xff1f; 2.什么是代理IP&#xff1f; 3.为什么使用代理IP&#xff1f; 三、使用Python爬虫代理IP增加博客阅读量的步骤 1.获取代理IP地址 2.模拟多次访问 3.定时任务 四、注意事项 五、总结 前言 随着互联…

Matlab 2024安装教程(附免费安装包资源)

鼠标右击软件压缩包&#xff0c;选择“解压到MatlabR2024a“。 2.打开解压后的文件夹&#xff0c;鼠标右击“MATHWORKS_R2024A“选择装载。 鼠标右击“setup“选择”以管理员身份运行“。点击“是“&#xff0c;然后点击”下一步“。复制一下密钥粘贴至输入栏&#xff0c;然后…

【Tars-go】腾讯微服务框架学习使用01--初始化服务

1 初始INIT-Demo运行 按照官网描述 go get 安装框架依赖 # < go 1.16 go get -u github.com/TarsCloud/TarsGo/tars/tools/tarsgo go get -u github.com/TarsCloud/TarsGo/tars/tools/tars2go # > go 1.16 go install github.com/TarsCloud/TarsGo/tars/tools/tarsgolat…

SSH安全设置

今天发现自己的公有云服务器被攻击了 然后查看了登录日志&#xff0c;如上图 ls -sh /var/log/secure vim /var/log/secure然后增加了安全相关的设置 具体可以从以下方面增加安全性&#xff1a; 修改默认SSH端口公有云修改安全组策略及防火墙端口设置登录失败次数锁定用户及限…

MySQL事务与事务原理

目录 事务 事务的四大特性ACID 事务隔离级别 事务原理 存储引擎 四大特性的保证 MVCC 事务链 ReadView 事务 事务指逻辑上的一组操作&#xff0c;组成这组操作的各个单元&#xff0c;要么全部成功&#xff0c;要么全部失败。 start transaction; -- 开启事务 或者 b…