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

ops/2025/1/12 8:48:50/

任务调度系统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.ppmy.cn/ops/149397.html

相关文章

Chart.js 雷达图:数据可视化利器

Chart.js 雷达图:数据可视化利器 引言 在数据可视化的领域中,雷达图以其独特的展示方式,成为了一种非常受欢迎的数据展现工具。雷达图能够将多个量化变量的数据以二维图表的形式展示出来,使得观察者能够快速地理解和比较不同数据集之间的差异。Chart.js 是一个强大的 Jav…

Gitlab-Runner配置

原理 Gitlab-Runner是一个非常强大的CI/CD工具。它可以帮助我们自动化执行各种任务&#xff0c;如构建、测试和部署等。Gitlab-Runner和Gitlab通过API通信&#xff0c;接收作业并提交到执行队列&#xff0c;Gitlab-Runner从队列中获取作业&#xff0c;并允许在不同环境下进行作…

《Opencv》信用卡信息识别项目

目录 一、项目介绍 二、数据材料介绍 1、模板图片&#xff08;1张&#xff09; 2、需要处理的信用卡图片&#xff08;5张&#xff09; 三、实现过程 1、导入需要用到的库 2、设置命令行参数 3、模板图像中数字的定位处理 4、信用卡图像处理 5、模板匹配 四、总结 一…

vs2022编译webrtc步骤

1、主要步骤说明 概述&#xff1a;基础环境必须有&#xff0c;比如git&#xff0c;Powershell这些&#xff0c;就不写到下面了。 1.1 安装vs2022 1、选择使用C的桌面开发 2、 Windows 10 SDK安装10.0.20348.0 3、勾选MFC及ATL这两项 4、 安装完VS2022后&#xff0c;必须安…

iOS中的设计模式(二)- 原型模式

引言 在软件开发中&#xff0c;创建对象的过程往往涉及许多复杂的初始化步骤&#xff0c;尤其是在对象之间具有相似属性或状态时。传统的做法是每次都从头开始创建新的实例&#xff0c;然而&#xff0c;这种方法可能导致性能问题和代码冗余。为了解决这一问题&#xff0c;原型…

QT + opencv 实现形状(轮廓)模板匹配

QT opencv 实现形状(轮廓)模板匹配 实现思路 1.创建模板数据&#xff1a;主要是提取模板的轮廓信息&#xff0c;这一步通常通过边缘检测实现。将模板的轮廓信息存储起来。 代码&#xff1a; //创建形状模板 bool cvLearnShapeMatchPattern_(Mat matDst, MyShapeUiParam pa…

字节小米等后端岗位C++面试题

C 基础 引用和指针之间的区别&#xff1f;堆栈和堆中的内存分配有何区别&#xff1f;存在哪些类型的智能指针&#xff1f;unique_ptr 是如何实现的&#xff1f;我们如何强制在 unique_ptr 中仅存在一个对象所有者&#xff1f;shared_ptr 如何工作&#xff1f;对象之间如何同步…

RK3568-ubuntu旋转显示和触摸

旋转屏幕显示 临时生效&#xff1a;xrandr -o <normal,inverted,left,right,0,1,2,3> 永久生效&#xff1a;/etc/X11/Xsession.d/55gnome-session_gnomerc最后一行添加临时生效命令旋转屏幕触摸 方法1&#xff1a;cp /usr/share/X11/xorg.conf.d/40-libinput.conf /etc…