Quartz.Net(1)

Quartz

1 Quartz是一个强大的、开源的、轻量级的任务调度框架 Quartz官方文档
2 Quartz中有五个重要的概念
  • Scheduler 调度器
  • Trigger 触发器
  • Job 工作任务
  • ThreadPool 线程池 ,不是CLI的线程池,而是Quartz特有的线程池
  • JobStrore 调度存储,存储执行计划的具体信息 ,可以存储在内存中RawStore,也可以持久化到数据库中 DbStore
3 使用Quartz需要先导入Nuget依赖包
  <ItemGroup><PackageReference Include="Quartz" Version="3.8.1" /></ItemGroup>
4 Quartz的示例代码
    public class Demo1{/// <summary>/// 使用WithSimpleSchedule触发器构建简单的间隔重复N次的Job数据/// </summary>/// <returns></returns>public async Task  demo1(){//从调度工厂类中获得调度器StdSchedulerFactory factory = new StdSchedulerFactory();IScheduler scheduler = await factory.GetScheduler();await scheduler.Start(); //调度器必须启动,否则调度任务实例的执行{//创建Job  使用建造者模式创建Job,绑定的工作Job实例为HelloJobIJobDetail job = JobBuilder.Create<HelloJob>().WithIdentity("job1", "group1").Build();//创建触发器 group1组下名为trigger1的触发器 。间隔1s,重复次数为3次ITrigger trigger = TriggerBuilder.Create().WithIdentity("trigger1", "group1").StartNow() //立即触发.WithSimpleSchedule(x => x.WithIntervalInSeconds(1).WithRepeatCount(3)).Build();//调度器根据触发器规则去调度工作任务 HelloJobawait scheduler.ScheduleJob(job, trigger);}}/// <summary>/// 使用WithDailyTimeIntervalSchedule来构建复杂的触发器逻辑/// </summary>/// <returns></returns>public async Task demo2() {//从调度工厂类中获得调度器StdSchedulerFactory factory = new StdSchedulerFactory();IScheduler scheduler = await factory.GetScheduler();await scheduler.Start(); {//创建Job  使用建造者模式创建Job,绑定的工作Job实例为HelloJobIJobDetail job = JobBuilder.Create<HelloJob>().WithIdentity("job1", "group1").Build();ITrigger trigger = TriggerBuilder.Create().WithIdentity("trigger1", "group1").StartNow() //立即触发.WithDailyTimeIntervalSchedule(action =>/*** OnDaysOfTheWeek 方法接受一个 DayOfWeek 枚举数组作为参数,你可以传入一个或多个 DayOfWeek 枚举值来指定具体的星期几。* 除了手动列出每一天,Quartz.NET 还提供了一些方便的方法来快速选择一周的特定日子组,例如:* OnMondayThroughFriday(): 周一至周五 OnSaturdayAndSunday(): 周六和周日 OnEveryDay(): 每天*/action.OnDaysOfTheWeek(DayOfWeek.Monday, DayOfWeek.Tuesday, DayOfWeek.Wednesday, DayOfWeek.Thursday, DayOfWeek.Friday) //周一到周五.StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(12, 00)) //每天12点开始.EndingDailyAt(TimeOfDay.HourAndMinuteOfDay(14, 00)) // 每天到23:59结束.WithIntervalInMinutes(30)//每间隔30分钟执行一次.WithRepeatCount(3) //重复3次// .OnEveryDay() //.OnMondayThroughFriday() //.OnSaturdayAndSunday() ).Build();//调度器根据触发器规则去调度工作任务 HelloJobawait scheduler.ScheduleJob(job, trigger);}}/// <summary>/// 使用Corn触发器来触发任务/// </summary>/// <returns></returns>public async Task demo3() {IScheduler scheduler = await StdSchedulerFactory.GetDefaultScheduler();scheduler.Start();{IJobDetail job = JobBuilder.Create<HelloJob>().WithIdentity("job1","group1").Build() ;ITrigger trigger = TriggerBuilder.Create().WithIdentity("trigger1", "group1").WithCronSchedule("* * * * * ? *") //cron表达式执行.Build(); //无限循环执行await scheduler.ScheduleJob(job,trigger);}}/// <summary>/// 触发器排除特定的日期/// </summary>/// <returns></returns>public async Task demo4() {IScheduler scheduler = await StdSchedulerFactory.GetDefaultScheduler();scheduler.Start();{IJobDetail job = JobBuilder.Create<HelloJob>().WithIdentity("job1", "group1").Build();ITrigger trigger = TriggerBuilder.Create().WithIdentity("trigger1", "group1").WithCronSchedule("* * * * * ? *") //cron表达式执行.ModifiedByCalendar("exclude_time") //.Build(); //无限循环执行//排除17:00-17:30的时间DailyCalendar dailyCalendar = new DailyCalendar(DateBuilder.DateOf(17,0,0).DateTime, DateBuilder.DateOf(17,30,0).DateTime);// 将日历添加到调度器await scheduler.AddCalendar("exclude_time", dailyCalendar, false, true);await scheduler.ScheduleJob(job, trigger);}}}
5 Quartz 与AOP

Quartz 中也有自己的切面编程逻辑,可以通过添加监听器的方式,去给工作任务装配额外的工作逻辑,比如记录日志、发送通知或其他自定义业务逻辑。

添加监听器

    /// <summary>/// Quartz中的AOP 切面编程/// </summary>public class JobListener : IJobListener{public string Name { get; }public JobListener(string Name) {this.Name = Name;}public Task JobExecutionVetoed(IJobExecutionContext context, CancellationToken cancellationToken = default){throw new NotImplementedException();}/// <summary>/// Job方法前执行/// </summary>/// <param name="context"></param>/// <param name="cancellationToken"></param>/// <returns></returns>public async Task JobToBeExecuted(IJobExecutionContext context, CancellationToken cancellationToken = default){Console.WriteLine("method before ");}/// <summary>/// Job方法后执行/// </summary>/// <param name="context"></param>/// <param name="jobException"></param>/// <param name="cancellationToken"></param>/// <returns></returns>public async Task JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException, CancellationToken cancellationToken = default){Console.WriteLine("method after ");}}

调度器中去装配JobListener

        public async Task demo5() {//从调度工厂类中获得调度器StdSchedulerFactory factory = new StdSchedulerFactory();IScheduler scheduler = await factory.GetScheduler();await scheduler.Start(); //调度器必须启动,否则调度任务实例的执行{//创建Job  使用建造者模式创建Job,绑定的工作Job实例为HelloJobIJobDetail job = JobBuilder.Create<HelloJob>().WithIdentity("job1", "group1").Build();//创建触发器 group1组下名为trigger1的触发器 。间隔1s,重复次数为3次ITrigger trigger = TriggerBuilder.Create().WithIdentity("trigger1", "group1").StartNow() //立即触发.WithSimpleSchedule(x => x.WithIntervalInSeconds(1).WithRepeatCount(3)).Build();//调度器注册JobListener,那么触发的工作任务就能在执行前与执行后处理一定的业务逻辑scheduler.ListenerManager.AddJobListener(new JobListener("listener"));//调度器根据触发器规则去调度工作任务 HelloJobawait scheduler.ScheduleJob(job, trigger);}}

除了可以在Job上增加AOP操作,也能针对触发器增加AOP操作。可以通过实现 ITriggerListener的类来定义一个在触发器触发时的切面类。使用触发器的监听器类时,同样只需要加入到调度器的ListenerManager中。

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

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

相关文章

三、配置带HybridCLR的ARCore开发环境

预告 本专栏将介绍如何使用这个支持热更的AR开发插件&#xff0c;快速地开发AR应用。 专栏&#xff1a; Unity开发AR系列 插件简介 通过热更技术实现动态地加载AR场景&#xff0c;简化了AR开发流程&#xff0c;让用户可更多地关注Unity场景内容的制作。 “EnvInstaller…”支…

【eclipse】如何在IDE里创建一个Java Web项目?

如何在eclipse中创建一个动态Web项目并成功运行&#xff1f; 一、 最终效果 懒得写那么多了…我也不知道该怎么写了&#xff0c;有点乱&#xff0c;有问题可以在评论里留言&#xff0c;我看到会解决的&#xff0c;在这个过程中也踩到了一些坑&#xff0c;但好在有CSDN帮助解决…

【C++杂货铺】红黑树

目录 &#x1f308;前言&#x1f308; &#x1f4c1; 红黑树的概念 &#x1f4c1; 红黑树的性质 &#x1f4c1; 红黑树节点的定义 &#x1f4c1; 红黑树的插入操作 &#x1f4c1; 红黑树和AVL树的比较 &#x1f4c1; 全代码展示 &#x1f4c1; 总结 &#x1f308;前言…

文章模版--测试

学习目标&#xff1a; 提示&#xff1a;这里可以添加学习目标 例如&#xff1a; 一周掌握 Java 入门知识 学习内容&#xff1a; 提示&#xff1a;这里可以添加要学的内容 例如&#xff1a; 搭建 Java 开发环境掌握 Java 基本语法掌握条件语句掌握循环语句 学习时间&#…

四川汇昌联信:拼多多网点怎么开?大概需要多少钱?

想要开一家拼多多网点&#xff0c;你肯定很关心需要准备多少资金。下面&#xff0c;我们就来详细解答这个问题&#xff0c;并从多个角度分析开设网点的要点。 一、 开设拼多多网点&#xff0c;首要任务是确定启动资金。根据不同的经营模式和地区差异&#xff0c;成本会有所不同…

WIFI模块的AT指令联网数据交互--第十天

1.1.蓝牙&#xff0c;ESP-01s&#xff0c;Zigbee, NB-Iot等通信模块都是基于AT指令的设计 初始配置和验证 ESP-01s出厂波特率正常是115200, 注意&#xff1a;AT指令&#xff0c;控制类都要加回车&#xff0c;数据传输时不加回车 1.2.上电后&#xff0c;通过串口输出一串系统…

【面试经典题】环形链表

个人主页&#xff1a;一代… 个人专栏&#xff1a;数据结构 在面试中我们经常会遇到有关链表的相关题目&#xff0c;面试官通常会对题目给出拓展 下面我就两个leetcode上的一个双指针的题目为例&#xff0c;并对其进行拓展 题目链接&#xff1a;环形链表 题目描述&#xf…

145.二叉树的后序遍历

刷算法题&#xff1a; 第一遍&#xff1a;1.看5分钟&#xff0c;没思路看题解 2.通过题解改进自己的解法&#xff0c;并且要写每行的注释以及自己的思路。 3.思考自己做到了题解的哪一步&#xff0c;下次怎么才能做对(总结方法) 4.整理到自己的自媒体平台。 5.再刷重复的类…

深入理解前端性能优化:从网络到渲染

1. 网络优化 减少HTTP请求 合并资源&#xff1a;通过合并CSS和JavaScript文件减少请求次数。资源内联&#xff1a;对于小的CSS和JavaScript&#xff0c;直接内联到HTML中。 使用HTTP/2 HTTP/2支持多路复用&#xff0c;减少请求阻塞&#xff0c;提高加载速度。 开启GZIP压缩…

Android获取系统常用阈值

问题 我自定义了一个控件&#xff0c;重写了其默认的OnTouch事件 这样系统自带的OnClickListener和OnLongClickListener就会失效 现在我想手动在OnTouch里实现Click和LongClick功能 这个很容易解决&#xff0c;通过touch时长就很容易实现 但是我想让LongClick触发的Time和系统…

LLVM中期报告

1&#xff0e;主要开展的工作 研究对LLVM IR层面进行代码混淆&#xff0c;分析IR的指令 &#xff0c;并且实现混淆 从LLVM代码混淆的角度出发&#xff0c;函数之间的正常调用构成了待混淆程序的原始控制流&#xff0c;不同的基础代码块构成了一个个的函数&#xff0c;每个基础…

Nginx-01-聊一聊 nginx

nginx 系列 Nginx-01-聊一聊 nginx Nginx-01-Nginx 是什么 Nginx-02-为什么使用 Nginx Nginx-02-Nginx Ubuntu 安装 windows10 WSL ubuntu 安装 nginx 实战笔记 Nginx-02-基本使用 Nginx-03-Nginx 项目架构 Nginx-04-Docker Nginx Nginx-05-nginx 反向代理是什么&…

自定义类型——结构体、枚举和联合

自定义类型——结构体、枚举和联合 结构体结构体的声明匿名结构体结构体的自引用结构体的初始化结构体的内存对齐修改默认对齐数结构体传参 位段枚举联合 结构体 结构是一些值的集合&#xff0c;这些值被称为成员变量&#xff0c;结构的每个成员可以是不同类型的变量。 数组是…

【随笔】Git 高级篇 -- 远程跟踪分支 git checkout -b | branch -u(三十五)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

go语言函数/方法入参对象方法 接口interface约束示例

go语言使用泛型接口约束可以约束指定的对象参数 必须具备指定的方法 或者必须实现了指定的接口 1个或者多个接口&#xff08;通过接口继承实现&#xff09;&#xff0c; 这个在面向api的接口编程中应用非常广泛&#xff0c;也非常实用&#xff0c;废话不多说&#xff0c;直接上…

向银行家应用程序添加日期

● 首先我们将下面图片上的时间更换成现在的时间 const now new Date(); const day now.getDate(); const month now.getMonth() 1; const year now.getFullYear(); const hour now.getHours(); const min now.getMinutes();labelDate.textContent ${day}/${month}/$…

parallelsdesktop19密钥激活 PD19虚拟机完整图文安装教程

Parallels Desktop 19 &#xff08;简称 PD 19)是最新发布的 macOS 平台的 windows 虚拟机&#xff0c;本文是使用 Parallels Desktop 19 虚拟机安装 Windows 的详细图文破解安装教程。 一下载安装 Parallels Desktop 软件下载完成后打开&#xff0c;双击打开 安装.dmg Para…

3. 深度学习笔记--优化函数

深度学习——优化器算法Optimizer详解&#xff08;BGD、SGD、MBGD、Momentum、Adagrad、Adadelta、RMSprop、Adam、Nadam、AdaMax、AdamW &#xff09; 0. GD &#xff08;梯度下降&#xff09; Gradient Descent&#xff08;梯度下降&#xff09;是一种迭代优化算法&#xf…

【C】每日一题 53 最大子数组和

给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 这是一个经典的动态规划问题&#xff0c;可以通过遍历数组并利用动态规划的思想来解决。…

汇昌联信电商:拼多多新手怎么做店铺的免费流量会慢慢起来?

在拼多多上开店&#xff0c;新手们往往面临着如何吸引免费流量的挑战。毕竟&#xff0c;流量是店铺生存和发展的血脉&#xff0c;没有流量&#xff0c;就没有销量&#xff0c;店铺也就失去了生命力。那么&#xff0c;作为拼多多新手&#xff0c;如何做才能让店铺的免费流量慢慢…