.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

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();

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

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

相关文章

Linux Kernel 之四 移植过程详解、STM32F769I-EVAL 开发板适配

在之前的博文 Linux Kernel 之一 完整嵌入式 Linux 环境、构建工具、编译工具链、CPU 体系架构 中说了要一步步搭建整个嵌入式 Linux 运行环境&#xff0c;今天主要学习一下将 Linux 内核适配 STM32F769I-EVAL 开发板。 源码 文中涉及的源代码均放到了我个人的 Github 上&…

SmartNews 基于 Flink 的 Iceberg 实时数据湖实践

摘要&#xff1a;本文整理自 SmartNews 数据平台架构师 Apache Iceberg Contributor 戢清雨&#xff0c;在 Flink Forward Asia 2022 实时湖仓专场的分享。本篇内容主要分为五个部分&#xff1a; SmartNews 数据湖介绍基于 Icebergv1 格式的数据湖实践基于 Flink 实时更新的数据…

C | atexit函数

C | atexit函数 文章目录 C | atexit函数atexit区别进程终止的方式Reference 欢迎关注公众号“三戒纪元” atexit main函数是整个程序的入口&#xff0c;但是其实可以在内核中可以使用链接器来设置程序的开始地方。 当内核使用⼀个exec函数执行C程序时&#xff0c;在调⽤main…

BI系统上的报表怎么导出来?附方法步骤

在BI系统上做好的数据可视化分析报表&#xff0c;怎么导出来给别人看&#xff1f;方法有二&#xff0c;分别是1使用报表分享功能&#xff0c;2使用报表导出功能。下面就以奥威BI系统为例&#xff0c;简明扼要地介绍这两个功能。 1、报表分享功能 作用&#xff1a; 让其他同事…

Android查看公钥与MD5

参考&#xff1a;填写App特征信息_备案-阿里云帮助中心 安卓应用获取App特征信息指导 包名、公钥和签名MD5获取方式有多种&#xff0c;本文以使用JadxGUI工具获取为例。 下载JadxGUI工具&#xff1a;GitHub - skylot/jadx: Dex to Java decompiler下载安装完成后&#xff0c;使…

【C++】String类基本接口介绍及模拟实现(多看英文文档)

string目录 如果你很赶时间&#xff0c;那么就直接看我本标题下的内容即可&#xff01;&#xff01; 一、STL简介 1.1什么是STL 1.2STL版本 1.3STL六大组件 1.4STL重要性 1.5如何学习STL 二、什么是string&#xff1f;&#xff1f;&#xff08;本质上是一个类&#xff0…

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

1. GOF-23 模式分类 从目的来看&#xff1a; 创建型&#xff08;Creational&#xff09;模式&#xff1a;将对象的部分创建工作延迟到子类或者其他对象&#xff0c;从而应对需求变化为对象创建时具体类型实现引来的冲击。结构型&#xff08;Structural&#xff09;模式&#…

爱分析《商业智能最佳实践案例》

近日&#xff0c;国内知名数字化市场研究咨询机构爱分析发布《2023爱分析商业智能最佳实践案例》&#xff0c;此评选活动面向落地商业智能的各行企业和商业智能厂商&#xff0c;以第三方专业视角深入调研&#xff0c;评选出具有参考价值的创新案例。永达汽车集团与数聚股份合作…

计算机竞赛 深度学习LSTM新冠数据预测

文章目录 0 前言1 课题简介2 预测算法2.1 Logistic回归模型2.2 基于动力学SEIR模型改进的SEITR模型2.3 LSTM神经网络模型 3 预测效果3.1 Logistic回归模型3.2 SEITR模型3.3 LSTM神经网络模型 4 结论5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 …

nginx反向代理

nginx反向代理8.反向代理8.1 实现http反向代理8.1.1 反向代理配置参数8.1.2 反向代理单台web服务器8.1.2.1 端口号后加"/"8.1.2.2 端口号后不加"/" 8.1.3指定location 实现反向代理,动静分离8.1.4 反向代理实例&#xff1a;缓存功能8.1.4.1 举例 8.1.5 实现…

Python:Tornado框架之获取get和post的传参

一、获取get方式传参 import tornado.ioloop #导入tornado包 import tornado.web class MainHandle(tornado.web.RequestHandler):def get(self,id): #定义请求函数self.write("Hello %s!" %id)apptornado.web.Application([ #定义应用配置函数(r"/…

HCL Domino LEAP与新的软件下载门户站点

大家好&#xff0c;才是真的好。 还记得Domino Volt吗&#xff1f;是的&#xff0c;我前面花了不少时间来讲基于Domino平台上的低代码开发工具Volt&#xff0c;不下十篇&#xff0c;我记得最后一篇是《Domino Volt 1.0.5中的可视化流程设计器》。结果就在去年11月&#xff0c;…

Android存储权限完美适配(Android11及以上适配)

一、Bug简述 一个很普通的需求&#xff0c;需要下载图片到本地&#xff0c;我的三个测试机&#xff08;荣耀Android10&#xff0c;红米 11 和小米Android 13都没有问题&#xff09;。 然后&#xff0c;主角登场了&#xff0c;测试的三星Android 13 死活拉不起存储权限弹窗。 …

A股风格因子看板 (2023.09 第07期)

该因子看板跟踪A股风格因子&#xff0c;该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子&#xff0c;用以分析市场风格切换、组合风格景露等。 今日为该因子跟踪第7期&#xff0c;指数组合数据截止日2023-08-31&#xff0c;要点如下 近1年A股风格因子收益走…

springboot集成mybatis-plus

一、在spring boot中配置mybatis-plus 1、创建一个spring boot项目&#xff0c;注意勾选mysql 2、在pom.xml文件中添加mybatis-plus的依赖包 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0&qu…

Linux C 网络基础

为什么需要网络通信&#xff1f; 进程间通信解决的是本机内通信 网络通信解决的是任意不同机器的通信 实现网络通信需要哪些支持 1.通信设备&#xff1a;网卡&#xff08;PC机自带&#xff09;&#xff1b; 路由器和交换机&#xff1b; 光纤…

MySQL的sql_mode合理设置

MySQL的sql_mode合理设置 1、sql_mode设置介绍说明 sql_mode是个很容易被忽视的变量&#xff0c;默认值是空值&#xff0c;在这种设置下是可以允许一些非法操作的&#xff0c;比如允许一些非法数据的插入。在生产环境必须将这个值设置为严格模式&#xff0c;所以开发、测试环…

jdk 21发布的意义

jdk 21 最大的功能是虚拟线程&#xff0c;是一种绿色线程&#xff08;具体可以看周志明老师的书籍《深入理解java虚拟机》&#xff09;&#xff0c;目前 jvm 与操作系统的线程是一一对应的关系。 使用了虚拟线程可以减少资源消耗&#xff0c;减少操作系统上下文切换&#xff0…

分享demo:Vue3 使用element plus + vue-i18实现国际化

&#x1f447;面是demo展示 PS&#xff1a;点赞关注私信获取demo

AVR 单片机 调试环境 JTAG MKII

注意 驱动 的厂家: 如果驱动备改变为其他厂家的驱动 就与 AVR Studio7不兼容 保证驱动选择正确是 能够使用硬件调试的关键 如果驱动不对&#xff0c;使用 USB驱动修改工具 修改 比如 UsbDriverTool.exe