任务调度系统Quartz.net详解2-Scheduler、Calendar及Listener

任务调度系统Quartz.net详解2-Scheduler、Calendar及Listener

Scheduler

调度器scheduler是Quartz中的独立工作容器,所有的Trigger和Job都需要注册到scheduler中才能工作。我们可以通过SchedulerFactory来获取scheduler实例。如下:

//1.获取默认的标准Scheduler引用
IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler().Result;
//2.通过代码配置schedulerNameValueCollection properties = new NameValueCollection{//scheduler的名字["quartz.scheduler.instanceName"] = "MyScheduler",// 设置线程池中线程个数为20个["quartz.threadPool.threadCount"] = "20",["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz",//JobStore类型为内存存储["quartz.jobStore.type"] = "Quartz.Simpl.RAMJobStore, Quartz"};
ISchedulerFactory factroy = new StdSchedulerFactory(properties);
IScheduler scheduler= await factroy .GetScheduler();

scheduler常用的方法

		  scheduler.Start();//start让调度线程启动scheduler.PauseJob(JobKey.Create("jobname", "groupname"));//暂停jobscheduler.ResumeJob(JobKey.Create("jobname", "groupname"));//重新启动jobscheduler.DeleteJob(JobKey.Create("jobname", "groupname"));//删除jobscheduler.PauseTrigger(new TriggerKey("triggername", "groupname"));//暂停triggerscheduler.ResumeTrigger(new TriggerKey("triggername", "groupname"));//重新启动triggerscheduler.UnscheduleJob(new TriggerKey("triggername", "groupname"));//删除triggerscheduler.GetTriggersOfJob(JobKey.Create("jobname", "groupname"));//获取一个job的所有key    scheduler.Standby();  //暂停所有的触发器,可通过shceduler.Start()重启scheduler.Shutdown(); //关闭scheduler,释放资源。通过Shutdown()关闭后,不能通过Start()重启scheduler.GetMetaData();//获取scheduler的元数据scheduler.Clear();//清空容器中所有的IJob,ITrigger

多任务调度

//调度多个任务
Dictionary<IJobDetail, IReadOnlyCollection<ITrigger>> triggersAndJobs = new Dictionary<IJobDetail, IReadOnlyCollection<ITrigger>>();triggersAndJobs.Add(job1, new List<ITrigger>() { trigger1,trigger2});triggersAndJobs.Add(job2, new List<ITrigger>() { trigger3});await scheduler.ScheduleJobs(triggersAndJobs, true);

Calendar

Calendar主要作用就是为了排除Trigger中一些特定的时间节点.

使用Calendar的流程是:首先获取一个Calendar实例,然后将Calendar注册到scheduler容器中,在将Calendar绑定到触发器上即可

 //通过调度工厂获取一个调度器实例StdSchedulerFactory factory = new StdSchedulerFactory();IScheduler scheduler = factory.GetScheduler().Result;
//创建jobIJobDetail Job1 = JobBuilder.Create<MyJob>().Build();
//获取一个Calendar实例
DailyCalendar calendar = new DailyCalendar(DateBuilder.DateOf(19, 0, 0).DateTime, DateBuilder.DateOf(21, 0, 0).DateTime);//设置19-21执不执行//将calendar加入到scheduler中
//最后两个参数是是否替换同名的calendar
//是否更新已有触发器的日历
scheduler.AddCalendar("mycal", calendar, true, true);
//创建触发器
ITrigger trigger1 = TriggerBuilder.Create() //获取TriggerBuilder//.StartAt(DateBuilder.TodayAt(01,34,00)) //开始时间,今天1点34分0秒(hh,mm,ss).StartNow() //也可以直接现在执行.ForJob(job2) //触发器关联的任务.WithPriority(1) //优先级,触发时间一样时,优先级大的先执行.WithCalendarIntervalSchedule(x => x.WithIntervalInMonths(1))//把Calendar绑定到trigger.ModifiedByCalendar("mycal").Build(); //利用TriggerBuilder创建ITrigger

Quartz.net中一共提供了六种Calendar,六种Calendar的用法大同小异,列举如下:

		【1】.DailyCalendar 用于排除一天中的某一段时间DailyCalendar calendar = new DailyCalendar(DateBuilder.DateOf(19, 0, 0).DateTime, DateBuilder.DateOf(23, 0, 0).DateTime);//21~23点不执行【2】.WeeklyCalendar 用于排除一周中的某几天WeeklyCalendar calendar = new WeeklyCalendar();calendar.SetDayExcluded(DayOfWeek.Sunday, true);//周日不执行 //注:如果想让周日恢复执行,执行代码:  calendar.SetDayExcluded(DayOfWeek.Sunday, false);【3】.HolidayCalendar 用于排除某些日期HolidayCalendar calendar = new HolidayCalendar();calendar.AddExcludedDate(DateTime.Parse("2018/1/2")); //2018年1月2号不执行//注:如果想让2019/1/9恢复执行,执行代码:  calendar.RemoveExcludedDate(DateTime.Parse("2018/1/2"));【4】.MonthlyCalendar 用于排除每个月的某天*************************************MonthlyCalendar calendar = new MonthlyCalendar();calendar.SetDayExcluded(8,true); //每个月的8号不执行//注:如果想让8号恢复执行,执行代码:  calendar.SetDayExcluded(8, false);【5】AnnualCalendar 用于排除一年中的某些天*************************************AnnualCalendar calendar = new AnnualCalendar();calendar.SetDayExcluded(DateTime.Parse("2018/1/2"), true);//每年1月2号不执行//注:如果想让1月8号恢复执行,执行代码:   calendar.SetDayExcluded(DateTime.Parse("2018/1/2"),true);【6】.CronCalendar 用于排除cron表达式表示的时间***************************CronCalendar calendar = new CronCalendar("* * * 2 1 ?"); //每年的1月2号不执行

Listener

JobListener用于在Job执行前、后和被拒绝时执行一些动作,和Asp.net中的filter很相似。

//需要集成相应的IJobListener接口
//TriggerListener和JobListener类似
public class MyJobListener : IJobListener
{public string Name => "hello joblisener";//job被拒绝时执行public async Task JobExecutionVetoed(IJobExecutionContext context, CancellationToken cancellationToken = default(CancellationToken)){await Task.Run(() => { });}//job开始前执行public async Task JobToBeExecuted(IJobExecutionContext context, CancellationToken cancellationToken = default(CancellationToken)){await Task.Run(() =>{Console.WriteLine("myjob-------------begin");});}//job完成后执行public async Task JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException, CancellationToken cancellationToken = default(CancellationToken)){await Task.Run(() =>{Console.WriteLine("myjob---------------end");Console.WriteLine();});}
}

设置scheduler的ListenerManager

//start让调度线程启动
//调度线程可以从jobstore中获取快要执行的trigger,然后获取trigger关联的job,执行job
scheduler.Start();
//myJobListener监控所有的job
scheduler.ListenerManager.AddJobListener(new MyJobListener(), GroupMatcher<JobKey>.AnyGroup());
//将job和trigger注册到scheduler中
//必须,否则不会执行任务
scheduler.ScheduleJob(job, trigger).Wait();

同理,TriggerListener和JobListener用法类似

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

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

相关文章

解锁 C# 与 LiteDB 嵌入式 NoSQL 数据库

一、开篇&#xff1a;邂逅 C# 与 LiteDB 新世界 在当今的软件开发领域&#xff0c;数据管理如同建筑的基石&#xff0c;而选择一款合适的数据库则是项目成功与否的关键因素之一。对于 C# 开发者来说&#xff0c;面对琳琅满目的数据库选项&#xff0c;如何抉择常常令人头疼。今…

Dependency check 通过Maven构建时,配置Mysql数据库遇到的三个坑

使用过Dependency check的同学&#xff0c;一定会遇到这个问题—— 每次执行依赖扫描时&#xff0c;由于网络问题会导致NVD下载种子数据的过程中的种种失败&#xff0c;不仅浪费了大量时间&#xff0c;还会因为下载文件的不完整性直接导致依赖检测的失败。所以我在使用Dependen…

Ubuntu中批量重命名,rename

你可以使用下面的命令批量重命名这些文件&#xff0c;在文件名中插入 _1&#xff1a; 方式一 使用 mv 命令批量重命名 如果你已经在终端中&#xff0c;且当前目录包含这些文件&#xff0c;可以执行以下命令&#xff1a; mv ai.c ai_1.c mv ai.h ai_1.h mv ao.c ao_1.c mv a…

JVM 优化指南

JVM 优化指南 1. JVM 参数配置 1.1 基础参数配置 设置堆内存大小 -Xms2048m -Xmx2048m 设置新生代大小 -Xmn1024m 设置元空间大小 -XX:MetaspaceSize256m -XX:MaxMetaspaceSize256m 设置线程栈大小 -Xss512k1.2 垃圾回收器配置 使用 G1 垃圾回收器 -XX:UseG1GC 设置期望停顿…

【面试题】技术场景 5、日志采集ELK

日志采集的重要性与采集方式 重要性&#xff1a;在项目开发、测试及生产环境中&#xff0c;日志是定位系统问题的关键手段&#xff0c;对系统维护与问题排查至关重要。采集方式 常规采集&#xff1a;按天保存日志文件至专门目录&#xff0c;文件名包含项目名、端口及日期&…

【数据库】三、SQL语言

文章目录 三、SQL语言1 概述2 数据定义(DDL)2.1 定义数据库2.2 定义基本表2.3 修改基本表2.4 删除基本表 3 数据操作(DML)3.1 数据查询3.1.1 单表查询3.1.2 连接查询3.1.3 嵌套查询3.1.4 集合查询 3.2 数据更新3.2.1 插入数据3.2.2 修改数据3.2.3 删除数据 4 数据控制(DCL)5 视…

C++ 的 pair 和 tuple

1 std::pair 1.1 C 98 的 std::pair 1.1.1 std::pair 的构造 ​ C 的二元组 std::pair<> 在 C 98 标准中就存在了&#xff0c;其定义如下&#xff1a; template<class T1, class T2> struct pair;std::pair<> 是个类模板&#xff0c;它有两个成员&#x…

Ubuntu | PostgreSQL | 解决 ERROR: `xmllint` is missing on your system.

解决 sudo apt install apt-file sudo apt-file updatesudo apt-file search xmllint sudo apt install libxml2-utils执行 # postgres源码安装包解压文件夹中 make install make install问题 make -C src install make[2]: Entering directory /home/postgres/postgresql-1…

springboot 加载本地jar到maven

在Spring Boot项目中&#xff0c;如果你想要加载一个本地的jar文件到Maven本地仓库&#xff0c;你可以使用Maven的install-file目标来实现。以下是一个简单的例子&#xff1a; 打开命令行工具&#xff08;例如&#xff1a;终端或者命令提示符&#xff09;。 执行以下Maven命令…

HTML5 Audio(音频)

HTML5 Audio(音频) HTML5 的 <audio> 元素是一个重要的革新,它为网页开发者提供了一种简单的方式来嵌入音频内容。在这篇文章中,我们将探讨 HTML5 <audio> 元素的特性、用法、浏览器兼容性,以及如何通过 JavaScript 和 CSS 对其进行控制和定制。 1. HTML5 <…

Unity中 Xlua使用整理(二)

1.Xlua的配置应用 xLua所有的配置都支持三种方式&#xff1a;打标签&#xff1b;静态列表&#xff1b;动态列表。配置要求&#xff1a; 列表方式均必须是static的字段/属性 列表方式均必须放到一个static类 建议不用标签方式 建议列表方式配置放Editor目录&#xff08;如果是H…

Python Matplotlib教程-Matplotlib 多子图布局

Python Matplotlib 多子图布局 Matplotlib 是 Python 中最常用的数据可视化库&#xff0c;它提供了强大的功能来绘制不同类型的图表。在实际应用中&#xff0c;通常需要将多个图表绘制在同一个画布上&#xff0c;这就需要用到 多子图布局。本篇文章将详细介绍如何使用 Matplot…

全方位解读消息队列:原理、优势、实例与实践要点

全方位解读消息队列&#xff1a;原理、优势、实例与实践要点 一、消息队列基础认知 在数字化转型浪潮下&#xff0c;分布式系统架构愈发复杂&#xff0c;消息队列成为其中关键一环。不妨把消息队列想象成一个超级“信息驿站”&#xff0c;在古代&#xff0c;各地的信件、物资运…

【LLM】25.1.10 Arxiv LLM论文速递

25.1.9 12:00 - 25.1.10 12:00 共更新44 篇 —第1篇---- ===== AgroGPT: 高效的农业视觉-语言模型与专家调优 🔍 关键词: 农业, 视觉-语言模型, 大型多模态对话模型, 专家调优 PDF链接 摘要: 在推进大型多模态对话模型(LMMs)方面已经取得了显著进展,利用了在线可用的…

Scala语言的软件开发工具

Scala语言的软件开发工具 Scala是一种强类型、函数式编程语言&#xff0c;融合了面向对象和函数式编程的特性&#xff0c;近年来受到越来越多开发者的关注。在Scala生态系统中&#xff0c;有许多优秀的工具和框架可以帮助开发者提高生产力、简化开发流程。本文将探讨一些常用的…

[离线数仓] 总结三、Hive数仓DIM层开发

5.9 数仓开发之DIM层 DIM层设计要点: (1)DIM层的设计依据是维度建模理论,该层存储维度模型的维度表。 (2)DIM层的数据存储格式为orc列式存储+snappy压缩。 (3)DIM层表名的命名规范为dim_表名_全量表或者拉链表标识(full/zip)。 -- 数仓开发之DIM层 -- DIM层设计要点:…

VUE3 事件的处理

在 Vue.js 中&#xff0c;事件处理是通过 v-on 指令来实现的&#xff0c;允许我们在 DOM 元素上监听用户交互并执行相应的操作。通过事件绑定&#xff0c;Vue.js 可以响应用户的点击、输入、提交等行为。 1. 基本的事件绑定 v-on 指令用于监听事件&#xff0c;并在事件发生时…

Photon最新版本PUN 2.29 PREE,在无网的局域网下,无法连接自己搭建的本地服务器

1.图1为官方解答 2.就是加上这一段段代码&#xff1a;PhotonNetwork.NetworkingClient.SerializationProtocol SerializationProtocol.GpBinaryV16; 完美解决 unity 商店最新PUN 2 插件 不能连接 &#xff08;环境为&#xff1a;本地局域网 无外网情况 &#xff09; …

消息中间件类型介绍

消息中间件是一种在分布式系统中用于实现消息传递的软件架构模式。它能够在不同的系统或应用之间异步地传输数据&#xff0c;实现系统的解耦、提高系统的可扩展性和可靠性。以下是几种常见的消息中间件类型及其介绍&#xff1a; 1.RabbitMQ 特点&#xff1a; • 基于AMQP&#…