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

news2025/1/14 19:00:40

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

Scheduler

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

//1.获取默认的标准Scheduler引用
IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler().Result;
//2.通过代码配置scheduler
 NameValueCollection 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"));//暂停job
          scheduler.ResumeJob(JobKey.Create("jobname", "groupname"));//重新启动job
          scheduler.DeleteJob(JobKey.Create("jobname", "groupname"));//删除job
          scheduler.PauseTrigger(new TriggerKey("triggername", "groupname"));//暂停trigger
          scheduler.ResumeTrigger(new TriggerKey("triggername", "groupname"));//重新启动trigger
          scheduler.UnscheduleJob(new TriggerKey("triggername", "groupname"));//删除trigger
          scheduler.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;
//创建job
 IJobDetail 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.coloradmin.cn/o/2276606.html

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

相关文章

Linux-----进程通讯(消息队列)

目录 相关API 1.相关数据类型 mqd_t struct mq_attr struct timespec 2.相关系统调用接口 mq_open() mq_timedsend() && mq_send() mq_timedreceive() && mq_receive() mq_unlink() clock_gettime() 父子进程使用消息队列通讯 平行进程使用消息队列…

YOLOv8从菜鸟到精通(二):YOLOv8数据标注以及模型训练

数据标注 前期准备 先打开Anaconda Navigator&#xff0c;点击Environment&#xff0c;再点击new(new是我下载anaconda的文件夹名称)&#xff0c;然后点击创建 点击绿色按钮&#xff0c;并点击Open Terminal 输入labelimg便可打开它,labelimg是图像标注工具&#xff0c;在上篇…

mac homebrew配置使用

本文介绍mac上homebrew工具的安装、配置过程。homebrew功能类似于centos的yum&#xff0c;用于软件包的管理&#xff0c;使用上有命令的差异。 本次配置过程使用mac&#xff0c;看官方文档&#xff0c;在linux上也可以用&#xff0c;但我没试过&#xff0c;有兴趣的同学可以试试…

《使用 YOLOV8 和 KerasCV 进行高效目标检测》

《使用 YOLOV8 和 KerasCV 进行高效目标检测》 作者&#xff1a;Gitesh Chawda创建日期&#xff1a;2023/06/26最后修改时间&#xff1a;2023/06/26描述&#xff1a;使用 KerasCV 训练自定义 YOLOV8 对象检测模型。 &#xff08;i&#xff09; 此示例使用 Keras 2 在 Colab 中…

【Uniapp-Vue3】onShow和onHide钩子的对比和执行顺序

页面生命周期函数的执行顺序是onLoad>onShow>onReady&#xff0c;其中只有onReady中才能获取到DOM节点。 一、onShow函数 每一次的页面切入都会触发onShow函数。 import {onShow} from "dcloudio/uni-app"; onShow(()>{...}) 如果我点击“跳转页面1”再返…

GPT 系列论文精读:从 GPT-1 到 GPT-4

学习 & 参考资料 前置文章 Transformer 论文精读 机器学习 —— 李宏毅老师的 B 站搬运视频 自监督式学习(四) - GPT的野望[DLHLP 2020] 來自猎人暗黑大陆的模型 GPT-3 论文逐段精读 —— 沐神的论文精读合集 GPT&#xff0c;GPT-2&#xff0c;GPT-3 论文精读【论文精读】…

(STM32笔记)十二、DMA的基础知识与用法 第二部分

我用的是正点的STM32F103来进行学习&#xff0c;板子和教程是野火的指南者。 之后的这个系列笔记开头未标明的话&#xff0c;用的也是这个板子和教程。 DMA的基础知识与用法 二、DMA传输设置1、数据来源与数据去向外设到存储器存储器到外设存储器到存储器 2、每次传输大小3、传…

2024年11月架构设计师综合知识真题回顾,附参考答案、解析及所涉知识点(一)

软考高级系统架构设计师考试包含三个科目&#xff1a;信息系统综合知识、系统架构设计案例分析和系统架构设计论文。考试形式为机考。本文主要回顾2024年下半年(2024-11-10)系统架构设计师考试上午综合知识科目的选择题&#xff0c;同时附带参考答案、解析和所涉知识点。 由于机…

AI浪潮下的IT变革之路:机遇、挑战与重塑未来

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 AI浪…

【RTSP】使用webrtc播放rtsp视频流

一、简介 rtsp流一般是监控、摄像机的实时视频流,现在的主流浏览器是不支持播放rtsp流文件的,所以需要借助其他方案来播放实时视频,下面介绍下我采用的webrtc方案,实测可行。 二、webrtc-streamer是什么? webrtc-streamer是一个使用简单机制通过 WebRTC 流式传输视频捕获…

【芯片设计- RTL 数字逻辑设计入门 9.2 -- flip flop 与 寄存器的关系详细介绍】

请阅读【嵌入式开发学习必备专栏 Cache | MMU | AMBA BUS | CoreSight | Trace32 | CoreLink | ARM GCC | CSH】 文章目录 Overview硬件角度的 Flip-Flop软件角度的寄存器举例说明硬件设计角度软件开发角度D Flip-Flop 实现基本原理:Verilog 代码:UT 示例JK Flip-Flop 实现基…

Harry技术添加存储(minio、aliyun oss)、短信sms(aliyun、模拟)、邮件发送等功能

Harry技术添加存储&#xff08;minio、aliyun oss&#xff09;、短信sms&#xff08;aliyun、模拟&#xff09;、邮件发送等功能 基于SpringBoot3Vue3前后端分离的Java快速开发框架 项目简介&#xff1a;基于 JDK 17、Spring Boot 3、Spring Security 6、JWT、Redis、Mybatis-P…

深度学习中的卷积和反卷积(三)——卷积和反卷积的计算

1 Stride和Padding的介绍 计算卷积和反卷积绕不开stride和padding的讨论。卷积和反卷积里都有stride和padding参数&#xff0c;但是同一个参数在卷积和反卷积里的作用不一样&#xff0c;非常容易使人困惑&#xff0c;本文试图理清他们的关系&#xff0c;并用实际数值例子演示计…

网页美观进阶:每一种渐变的实现方式

CSS 渐变效果详解&#xff1a;每一种渐变的实现方式 在现代网页设计中&#xff0c;CSS 渐变效果为我们提供了一种丰富的视觉表现手段&#xff0c;可以使简单的背景或元素具有动态和立体感。渐变从单一颜色转变为另一种颜色&#xff0c;为网站增添了活力与美感。在这篇博文中&a…

Mac MySQL 8.0.30的安装(保姆级教程)

目录预览&#xff1a; 一、下载及安装1.下载2.安装 二、环境变量配置1.编辑文件2.添加配置3.配置生效4.版本查看 三、启动1.MySQL服务的启停和状态的查看2.启动mysql2.1 查看服务状态2.2 Mysql关掉重启2.2.1 查看进程2.2.2 杀死进程2.2.3 验证进程是否成功杀死2.2.4 重新启动My…

Linux服务器网络丢包场景及解决办法

一、Linux网络丢包概述 在数字化浪潮席卷的当下&#xff0c;网络已然成为我们生活、工作与娱乐不可或缺的基础设施&#xff0c;如同空气般&#xff0c;无孔不入地渗透到各个角落。对于 Linux 系统的用户而言&#xff0c;网络丢包问题却宛如挥之不去的 “噩梦”&#xff0c;频繁…

浅谈云计算09 | 服务器虚拟化

服务器虚拟化基础 一、虚拟化的定义二、系统虚拟化三、服务器虚拟化的核心要义四、典型实现&#xff1a;探索不同路径五、全虚拟化与半虚拟化六、主流服务器虚拟化技术 一、虚拟化的定义 虚拟化是一种将物理资源抽象为逻辑资源的技术&#xff0c;通过在物理硬件与操作系统、应…

traceroute原理探究

文章中有截图&#xff0c;看不清的话&#xff0c;可以把浏览器显示比例放大到200%后观看。 linux下traceroute的原理 本文通过抓包观察一下linux下traceroute的原理 环境&#xff1a;一台嵌入式linux设备&#xff0c;内网ip是192.168.186.195&#xff0c;其上有192.168.202.…

uni-app无限级树形组件简单实现

因为项目一些数据需要树形展示&#xff0c;但是官网组件没有。现在简单封装一个组件在app中使用&#xff0c;可以无线嵌套&#xff0c;展开&#xff0c;收缩&#xff0c;获取子节点数据等。 简单效果 组件TreeData <template><view class"tree"><te…

4种革新性AI Agent工作流设计模式全解析

文章目录 导读&#xff1a;AI Agent的四种关键设计模式如下&#xff1a;1. 反思2. 工具使用3. 规划4. 多Agent协作 总结内容简介&#xff1a; 导读&#xff1a; AI Agent是指能够在特定环境中自主执行任务的人工智能系统&#xff0c;不仅接收任务&#xff0c;还自主制定和执行…