第四节: Quartz.Net五大构件之Trigger通用用法(常用方法、优先级、与job关联等)
一. 简介
1. 几个类型:
①:TriggerBuilder:用来创建ITrigger实例
②:ITrigger:触发器实例
2.常用的几个方法
①.StartNow:Trigger马上触发.
②.StartAt和EndAt:设置Trigger触发的开始时间和结束时间 (省略设置开始时间的话,默认从当前时间开始执行)
③.UsingJobData:给Trigger添加一些附加值(通过context.Trigger.JobDataMap获取)
④.WithDescription:用来描述该触发器,并没有什么实际左右
⑤.WithPriority:设置Trigger的优先级,默认为5,数字越大,优先级越高.(该优先级用于一个job对应多个Trigger,且Trigger的触发时间相同,优先级越大的越先执行)
⑥.ForJob:将job和trigger进行关联,该方法有多个重载,关联后ScheduleJob方法进行调度时,只需将trigger传入进去即可
二. Job和Trigger关联问题
(1). 1个job对应1个trigger:调用ScheduleJob(IJobDetail jobDetail, ITrigger trigger),直接关联即可,无须做特别处理
(2). 1个job对应多个trigger:有两种方案解决
方案A: 将job持久化(StoreDurably(true)),然后通过AddJob方法加入调度池中,Trigger上通过ForJob方法和指定job进行关联,然后调用ScheduleJob(ITrigger trigger)方法,将trigger全部加入调度池中,最后Start开启即可
方案B: 创建job和trigger都不需要关联,也不需要特殊设置,最后将trigger加入一个HashSet<ITrigger>池中,通过一次性通过 ScheduleJob(IJobDetail jobDetail, Collection.ISet<ITrigger> triggersForJob, bool replace)进行关联
(3). 2个job对应1个trigger (不常用)
利用JobChainingJobListener实现
代码分享:
//1. 创建Schedule
IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
//2. 创建Job
var job1 = JobBuilder.Create<HelloJob3>()
.WithIdentity("job1", "jobGroup1")
.StoreDurably(true)
.Build();
var job2 = JobBuilder.Create<HelloJob>()
.WithIdentity("job2", "jobGroup2")
.StoreDurably(true)
.Build();
/********************************* 下面测试job和 Trigger的关联问题 (与下面Trigger优先级的测试互不影响)**************************************/ #region 情况1:1个job对应1个trigger
{
var trigger = TriggerBuilder.Create()
.UsingJobData("name", "ypf1") //附加信息
.UsingJobData("age", "age1")
.StartAt(DateBuilder.EvenSecondDateAfterNow()) //表示下一个秒整点开启,比如现在9点19分20秒,那么9点20分21s整开启
.WithSimpleSchedule(x => x.WithIntervalInSeconds().RepeatForever())
.EndAt(DateTimeOffset.Now.AddSeconds()) //60s后结束
.Build();
scheduler.ScheduleJob(job1, trigger);
scheduler.Start();
}
#endregion #region 情况2:1个job对应多个Trigger
//方案1
{
var trigger1 = TriggerBuilder.Create()
.UsingJobData("name", "ypf1") //附加信息
.UsingJobData("age", "age1")
.StartNow() //马上开启
.WithSimpleSchedule(x => x.WithIntervalInSeconds().RepeatForever()) //每隔两秒执行一次
.EndAt(DateTimeOffset.Now.AddSeconds()) //60s后结束
.ForJob("job1", "jobGroup1") //通过表名和组名进行关联
.Build();
var trigger2 = TriggerBuilder.Create()
.UsingJobData("name", "ypf2") //附加信息
.UsingJobData("age", "age2")
.StartNow() //马上开启
.WithSimpleSchedule(x => x.WithIntervalInSeconds().RepeatForever()) //每隔5秒执行一次
.EndAt(DateTimeOffset.Now.AddSeconds()) //60s后结束
.ForJob(job1) //直接IJobDetail关联
.Build(); scheduler.AddJob(job1, true);
scheduler.ScheduleJob(trigger1);
scheduler.ScheduleJob(trigger2);
scheduler.Start();
}
//方案2
{
var trigger1 = TriggerBuilder.Create()
.UsingJobData("name", "ypf1") //附加信息
.UsingJobData("age", "age1")
.StartNow() //马上开启
.WithSimpleSchedule(x => x.WithIntervalInSeconds().RepeatForever()) //每隔两秒执行一次
.EndAt(DateTimeOffset.Now.AddSeconds()) //60s后结束
.Build();
var trigger2 = TriggerBuilder.Create()
.UsingJobData("name", "ypf2") //附加信息
.UsingJobData("age", "age2")
.StartNow() //马上开启
.WithSimpleSchedule(x => x.WithIntervalInSeconds().RepeatForever()) //每隔5秒执行一次
.EndAt(DateTimeOffset.Now.AddSeconds()) //60s后结束
.Build(); Quartz.Collection.HashSet<ITrigger> triggerHash = new Quartz.Collection.HashSet<ITrigger>();
triggerHash.Add(trigger1);
triggerHash.Add(trigger2);
scheduler.ScheduleJob(job1, triggerHash, true);
scheduler.Start();
}
#endregion #region 情况3:2个job对应1个trigger
{
//每s执行一次
var trigger = TriggerBuilder.Create().WithCronSchedule("/1 * * * * ?").Build(); JobChainingJobListener listener = new JobChainingJobListener("mytest");
listener.AddJobChainLink(job1.Key, job2.Key);
scheduler.ListenerManager.AddJobListener(listener); scheduler.AddJob(job2, true);
scheduler.ScheduleJob(job1, trigger);
scheduler.Start();
}
#endregion
三. Trigger的优先级(未完)
利用WithPriority方法,该优先级用于一个job对应多个Trigger,且Trigger的触发时间相同,优先级越大的越先执行。

第四节: Quartz.Net五大构件之Trigger通用用法(常用方法、优先级、与job关联等)的更多相关文章
- 第九节: 利用RemoteScheduler实现Sheduler的远程控制 第八节: Quartz.Net五大构件之SimpleThreadPool及其四种配置方案 第六节: 六类Calander处理六种不同的时间场景 第五节: Quartz.Net五大构件之Trigger的四大触发类 第三节: Quartz.Net五大构件之Scheduler(创建、封装、基本方法等)和Job(创建、关联
第九节: 利用RemoteScheduler实现Sheduler的远程控制 一. RemoteScheduler远程控制 1. 背景: 在A服务器上部署了一个Scheduler,我们想在B服务器上 ...
- 第五节: Quartz.Net五大构件之Trigger的四大触发类
一. WithSimpleSchedule(ISimpleTrigger) 1. 用途:时.分.秒上的轮询(和timer类似),实际开发中,该场景占绝大多数. 2. 轮询的种类:永远轮询和限定次数轮询 ...
- 第三节: Quartz.Net五大构件之Scheduler(创建、封装、基本方法等)和Job(创建、关联等)
一. 五大构件 引言: Quartz.Net的五大构件 1. 调度器:Scheduler 2. 作业任务:Job 3. 触发器: Trigger 4. 线程池: SimpleThreadPoo ...
- 第八节: Quartz.Net五大构件之SimpleThreadPool及其四种配置方案
一. 简介 揭秘: SimpleThreadPool是Quartz.Net中自带的线程池,默认个数为10个,代表一个Scheduler同一时刻并发的最多只能执行10个job,超过10个的job需要排队 ...
- ASP.NET MVC深入浅出(被替换) 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式 第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery ) 第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法 第六节: EF高级属性(二) 之延迟加载、立即加载、显示加载(含导航属性) 第十节: EF的三种追踪
ASP.NET MVC深入浅出(被替换) 一. 谈情怀-ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态 ...
- android内部培训视频_第四节(1)_异步网络操作
第四节(1):异步网络操作 一.结合asyncTask下载网络图片 1.定义下载类,继承自asyncTask,参数分别为:String(url地址),Integer(刻度,本例没有用到),BitMa ...
- Centos7 install Openstack - (第四节)添加计算服务(Nova)
Centos7 install Openstack - (第四节)添加计算服务(Nova) 我的blog地址:http://www.cnblogs.com/caoguo 该文根据openstack官方 ...
- 第四节,Linux基础命令
第四节,Linux基础命令 命令是系统操作员对系统传入的指令,传入指令后回车,系统接收到指令做出相应的行为 1.查看用户位于系统什么位置 [pmd]检查操作用户位于系统的什么位置 命令 ...
- VUE2.0实现购物车和地址选配功能学习第四节
第四节 v-on实现金额动态计算 用¥金额 进行格式处理,可以使用原生js进行转换,但是在vuei,使用filter过滤器更加方便 注: 1.es6语法=>和import等 好处在于res参数后 ...
随机推荐
- docker compose 服务启动顺序控制
概要 docker-compose 可以方便组合多个 docker 容器服务, 但是, 当容器服务之间存在依赖关系时, docker-compose 并不能保证服务的启动顺序. docker-comp ...
- China Tightens Recycling Import Rules
China Tightens Recycling Import Rules We have all seen the pictures of cities in China with air poll ...
- Redis操作集合,有序集合
Set操作,Set集合就是不允许重复的列表 sadd(name,values) 1 # name对应的集合中添加元素 scard(name) 1 获取name对应的集合中元素个数 sdiff(keys ...
- django 模型层(2)
Django 模型层(2) 多表操作---模型之间的关系 1 一对一:作者----作者详细信息 2 一对多:书籍----出版社 3 多对多:书籍----作者 一 创建模型(主键(id)自动创建) 没 ...
- ssr
使用Nuxt.js改造已有项目的方法 https://www.jb51.net/article/145203.htm
- ORACLESQL语句的优化
ORACLESQL语句的优化: 选择最有效率的表名顺序:应该选择记录条数最少的表作为基表! 因为Oracle解析器的处理顺序是从右至左的.当ORACLE处理多个表时, 会运用排序及合并的方式连接它们. ...
- 在Linux命令行中以图形化窗口打开文件夹
Linux 系统中也有类似的命令.Ubuntu 发行版的命令行中,我们可以使用 nautilus 命令来打开指定目录的图形化窗口界面.类似下面命令这样使用: nautilus /home/testPr ...
- docker面试整理
为什么要使用docker https://www.cnblogs.com/AshOfTime/p/10755479.html docker的使用场景 docker和虚拟机比较的优势 https: ...
- Java面试准备之Java基础
1.Java 语言的优点 面向对象,平台无关,内存管理,安全性,多线程,Java 是解释型的 2.Java 和 C++的区别 多重继承(java接口多重,类不支持,C++支持) 自动内存管理 预处理功 ...
- 玩转3D Swiper美女性感秀之思路分析总结
前言 继一次的3D魔方之后,这次利用CSS3的transform.translate.rotate.preserve-3d等结合JS的requestAnimationFrame.class带你一起玩转 ...