c#之 quartz的学习
目录:
一. Quartz的API
二.Trigger 的使用
三.使用 JobDataMap 来往Job中传值
四. Calendars
五.SimpleTrigger
六.CronTrigger
一. Quartz的API
- IScheduler - 与 scheduler 进行交互的主要接口
- IJob - 你希望被 scheduler 执行的组件的接口
- IJobDetail - 用于定义 Jobs 实例
- ITrigger - 定义将会在scheduler上执行的 job 上的组件
- JobBuilder - 用于定义或建立(define/build) JobDetail 实例,JobDetail定义了Jobs实例
- TriggerBuilder - 用于定义或建立 Trigger 实例
可以对照 这一篇 quartz 的代码来印证
二.Trigger 的使用
// define the job and tie it to our HelloJob class
IJobDetail job = JobBuilder.Create<HelloJob>()
.WithIdentity("myJob", "group1") // name "myJob", group "group1"
.Build(); // Trigger the job to run now, and then every 40 seconds
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("myTrigger", "group1")
.StartNow()
.WithSimpleSchedule(x => x
.WithIntervalInSeconds()
.RepeatForever())
.Build(); // Tell quartz to schedule the job using our trigger
await sched.scheduleJob(job, trigger);
这里除了 WithSimpleSchedule 扩展方法,还有如下:
- WithCalendarIntervalSchedule
- WithCronSchedule
- WithDailyTimeIntervalSchedule
- WithSimpleSchedule
三.使用 JobDataMap 来往Job中传值
在JobDataMap中设置值
// define the job and tie it to our DumbJob class
IJobDetail job = JobBuilder.Create<DumbJob>()
.WithIdentity("myJob", "group1") // name "myJob", group "group1"
.UsingJobData("jobSays", "Hello World!")
.UsingJobData("myFloatValue", 3.141f)
.Build();
从JobDataMap中获取值
public class DumbJob : IJob
{
public async Task Execute(IJobExecutionContext context)
{
JobKey key = context.JobDetail.Key; JobDataMap dataMap = context.JobDetail.JobDataMap; string jobSays = dataMap.GetString("jobSays");
float myFloatValue = dataMap.GetFloat("myFloatValue"); await Console.Error.WriteLineAsync("Instance " + key + " of DumbJob says: " + jobSays + ", and val is: " + myFloatValue);
}
}
还有从 JobExecutionContext’s merged JobDataMap 中获取值的方式
public class DumbJob : IJob
{
public async Task Execute(IJobExecutionContext context)
{
JobKey key = context.JobDetail.Key; JobDataMap dataMap = context.MergedJobDataMap; // Note the difference from the previous example string jobSays = dataMap.GetString("jobSays");
float myFloatValue = dataMap.GetFloat("myFloatValue");
IList<DateTimeOffset> state = (IList<DateTimeOffset>)dataMap["myStateData"];
state.Add(DateTimeOffset.UtcNow); await Console.Error.WriteLineAsync("Instance " + key + " of DumbJob says: " + jobSays + ", and val is: " + myFloatValue);
}
}
或者,可以通过注入 data map 的值到类中
public class DumbJob : IJob
{
public string JobSays { private get; set; }
public float FloatValue { private get; set; } public async Task Execute(IJobExecutionContext context)
{
JobKey key = context.JobDetail.Key; JobDataMap dataMap = context.MergedJobDataMap; // Note the difference from the previous example IList<DateTimeOffset> state = (IList<DateTimeOffset>)dataMap["myStateData"];
state.Add(DateTimeOffset.UtcNow); await Console.Error.WriteLineAsync("Instance " + key + " of DumbJob says: " + JobSays + ", and val is: " + FloatValue);
}
}
四. Calendars
ICalendar 接口
namespace Quartz
{
public interface ICalendar
{
string Description { get; set; } ICalendar CalendarBase { set; get; } bool IsTimeIncluded(DateTimeOffset timeUtc); DateTime GetNextIncludedTimeUtc(DateTimeOffset timeUtc); ICalendar Clone();
}
}
示例:
HolidayCalendar cal = new HolidayCalendar();
cal.AddExcludedDate(someDate); await sched.AddCalendar("myHolidays", cal, false); ITrigger t = TriggerBuilder.Create()
.WithIdentity("myTrigger")
.ForJob("myJob")
.WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(, )) // execute job daily at 9:30 每天9:30执行
.ModifiedByCalendar("myHolidays") // but not on holidays 不包含假期
.Build(); // .. schedule job with trigger ITrigger t2 = TriggerBuilder.Create()
.WithIdentity("myTrigger2")
.ForJob("myJob2")
.WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(, )) // execute job daily at 11:30
.ModifiedByCalendar("myHolidays") // but not on holidays
.Build(); // .. schedule job with trigger2
用来在日历上的某一段时间不必执行任务时,可以使用这种方式
五.SimpleTrigger
这里列举一些Simple Trigger 的使用示例
1.建立一个在某个时间点的触发器,不重复执行
// trigger builder creates simple trigger by default, actually an ITrigger is returned
ISimpleTrigger trigger = (ISimpleTrigger) TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.StartAt(myStartTime) // some Date
.ForJob("job1", "group1") // identify job with name, group strings
.Build();
2.建立一个某个时间点的触发器,并且每10秒执行一次,执行10次
trigger = TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.StartAt(myTimeToStartFiring) // if a start time is not given (if this line were omitted), "now" is implied
.WithSimpleSchedule(x => x
.WithIntervalInSeconds()
.WithRepeatCount()) // note that 10 repeats will give a total of 11 firings
.ForJob(myJob) // identify job with handle to its JobDetail itself
.Build();
3.建立一个触发器,在之后每5分钟执行一次
trigger = (ISimpleTrigger) TriggerBuilder.Create()
.WithIdentity("trigger5", "group1")
.StartAt(DateBuilder.FutureDate(, IntervalUnit.Minute)) // use DateBuilder to create a date in the future
.ForJob(myJobKey) // identify job with its JobKey
.Build();
4.建立一个触发器,每5分钟执行一次,知道22:00
trigger = TriggerBuilder.Create()
.WithIdentity("trigger7", "group1")
.WithSimpleSchedule(x => x
.WithIntervalInMinutes()
.RepeatForever())
.EndAt(DateBuilder.DateOf(, , ))
.Build();
5.建立一个触发器,将在下一个整点执行,每2个小时执行一次
trigger = TriggerBuilder.Create()
.WithIdentity("trigger8") // because group is not specified, "trigger8" will be in the default group
.StartAt(DateBuilder.EvenHourDate(null)) // get the next even-hour (minutes and seconds zero ("00:00"))
.WithSimpleSchedule(x => x
.WithIntervalInHours()
.RepeatForever())
// note that in this example, 'forJob(..)' is not called
// - which is valid if the trigger is passed to the scheduler along with the job
.Build(); await scheduler.scheduleJob(trigger, job);
六.CronTrigger
CronExpression 用于配置CronTrigger 的实例,Cron-Expression 是一个由7个 sub-expression 组成的字符串,
这7个 sub-expression 由空格分隔开,代表的含义:
- Seconds
- Minutes
- Hours
- Day-of-Month
- Month
- Day-of-Week
- Year (optional field)
这里的1-7个,每个都是一个field ;
例如: “0 0 12 ? * WED” 表示每个周三的12点
1.单独的 sub-expression 可以包含 ranges and/or (即某个范围,与,或) ,
例如前面的 week 属性 的WED,可以替换为 “MON-FRI” , “MON, WED, FRI” , “MON-WED,SAT”
2.通配符可以被用来表示可能的值,因此前面例子中的 Month 处的 * ,意味着每个月;而 Day-of-Month 处如果使用 * ,表示 这周的每天
3.所有的field 都有一个有效值的集合可被指定。
- seconds and minutes:0-59
- hours : 0-23
- Day-of-Month : 0-31 ,但是这个地方,你需要根据每个月有多少天来进行给值
- Months : 0-11 或者用JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV ,DEC
- Days-of-Week : 0-7 (1=Sunday) 或者 SUN, MON, TUE, WED, THU, FRI and SAT
4. / 符号,可以用来指定值的增量。例如 0/15 表示在Minutes field 处,它意味着每15分钟,从0分钟开始;如果 ‘3/20’ ,表示在Minutes field 处,每20分钟,从3分钟处开始;
5.? 符号,用于day-of-month 和 day-of-week 处。用于指定没有特定值。当你需要在这两个field中的其中一个指定值,而另一个不指定时,是有用的;
6. L 符号,用在 day-of-month 和 day-of-week 处。这个符号是 last 的缩写,在两个不同的field (指day-of-month 和day-of-week )有不同的含义。
例如,
L 用在day-of-month处意味着月份的最后一个天;
L单独用在day-of-week 处,表示 7 或者 SAT ,
但是如果用在另一个值的后面,则意味着 the last xxx day of the month ,
例如,6L或者FRIL 这两个都意味着 the last friday of the month 即这个月的最后一个周五;
当使用L时,不要指定 lists 或者范围值,因为你将得到令人困惑的结果。
7.W 符号,指定最接近给定日期的周(星期)。例如,当你在 day-of-month 处指定15W时,意味着最接近这个月15号的周(星期)。
8. # 符号,指定月份的第几个周(星期),例如, 在day-of-week 处的 6#3 或者 FRI#3 意味着月份的第三个周五
下面是一些使用示例
1>.每5分钟执行一次
"0 0/5 * * * ?"
2>.每5分钟,并且这分钟的10秒开始执行(i.e. 10:00:10 am, 10:05:10 am, etc)
"10 0/5 * * * ?"
3>.每周三和周五的10:30,11:30,12:30,13:30 执行
" 0 30 10-13 ? * WED,FRI"
4>.在每个月的5号和20号,在8点和10点之间,每30分钟执行一次(10:00不执行,在8:00,8:30,9:00,9:30 执行)
"0 0/30 8-9 5,20 * ?"
建立CronTriggers
在每天上午8:00到17:00之间,每隔1秒执行一次
trigger = TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.WithCronSchedule("0 0/2 8-17 * * ?")
.ForJob("myJob", "group1")
.Build();
在每天10:42am执行
// we use CronScheduleBuilder's static helper methods here
trigger = TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(, ))
.ForJob(myJobKey)
.Build();
或者
trigger = TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.WithCronSchedule("0 42 10 * * ?")
.ForJob("myJob", "group1")
.Build();
建立一个触发器,在每周三10:42执行,并且指定一个TimeZone而不是系统默认的
trigger = TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.WithSchedule(CronScheduleBuilder
.WeeklyOnDayAndHourAndMinute(DayOfWeek.Wednesday, , )
.InTimeZone(TimeZoneInfo.FindSystemTimeZoneById("Central America Standard Time")))
.ForJob(myJobKey)
.Build();
或
trigger = TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.WithCronSchedule("0 42 10 ? * WED", x => x
.InTimeZone(TimeZoneInfo.FindSystemTimeZoneById("Central America Standard Time")))
.ForJob(myJobKey)
.Build();
还有一些监听的listener 等其他知识,这里没讲,
可以参考网址
https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/index.html
c#之 quartz的学习的更多相关文章
- Quartz定时任务学习(二)web应用/Quartz定时任务学习(三)属性文件和jar
web中使用Quartz 1.首先在web.xml文件中加入 如下内容(根据自己情况设定) 在web.xml中添加QuartzInitializerServlet,Quartz为能够在web应用中使用 ...
- Quartz定时任务学习(二)web应用
web中使用Quartz 1.首先在web.xml文件中加入 如下内容(根据自己情况设定) 在web.xml中添加QuartzInitializerServlet,Quartz为能够在web应用中使用 ...
- Quartz.NET学习系列
Quartz.NET它是一个开源的任务调度引擎,对于周期性任务,持久性任务提供了很好的支持,并且支持持久性.集群等功能. 这是什么对我来说Quartz.NET学习记录: 源代码下载http://yun ...
- Quartz框架学习(1)—核心层次结构
Quartz框架学习 Quartz(任务调度)框架的核心组件: job:任务.即任务调度行为中所要调度的对象. trigger:触发器.是什么促使了一个任务的调度?当然是时间.这也算事件驱动类型程序. ...
- Quartz定时任务学习(一)简单任务
学习quartz首先了解三个概念: 调度器:负责调度作业和触发器: 触发器:设置作业执行的时间.参数.条件等:(简单触发器和Cron触发器) 作业:定时任务内容,被执行的程序: 下载必要的jar包,直 ...
- Quartz定时任务学习(五)触发器
顾名思义,Trigger(触发器)的责任就是触发一个 Job 去执行.当用 Scheduler 注册一个 Job 的时候要创建一个 Trigger 与这个 Job 相关联.Quartz 提供了四种类型 ...
- Quartz.Net 学习之路02 初探Quartz.Net
第二讲:简单的实例,看看Quartz.Net强在哪里? 直接上代码,代码里有注释: using System; using Quartz; using Quartz.Impl; namespace L ...
- quartz.net 学习
目录 简介 Quartz是什么? Quartz的应用场景Quartz的安装 安装 源码Hello World范例API 核心API Scheduler接口: Job接口 J ...
- quartz的学习和简单使用
以前在框架中使用过,很多都是纯粹的复制粘贴,了解过用法知道如何配置,但时间久了就没什么印象了,现在重新捡起来,再次进行学习. quartz相关的介绍都已经很多了,我就不重复啰嗦,简单说一下个人的认识和 ...
- Quartz定时任务学习(九)Quartz监听器
Quartz 提供了三种类型的监听器:监听 Job 的,监听 Trigger 的,和监听 Scheduler 自已的. 本章解释如何应用每一种类型来更好的管理你的 Quartz 应用,并获悉到什么事件 ...
随机推荐
- hbase_学习_01_HBase环境搭建(单机)
一.前言 本文承接上一篇:hadoop_学习_02_Hadoop环境搭建(单机) ,主要是搭建HBase的单机环境 二.环境准备 1.说明 hbase 的下载来源有: 官方版本:http://arc ...
- SpringBoot_异常_01_Caused by: java.lang.BootstrapMethodError: java.lang.NoSuchMethodError
一.异常信息 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'gsonB ...
- Java_注解_00_资源贴
1.Java注解教程:自定义注解示例,利用反射进行解析 2. (1)深入理解Java:注解(Annotation)基本概念 (2)深入理解Java:注解(Annotation)自定义注解入门 (3)深 ...
- Execution Context(EC) in ECMAScript
参考资料 执行环境,作用域理解 深入理解JavaScript系列(2):揭秘命名函数表达式 深入理解JavaScript系列(12):变量对象(Variable Object) 深入理解JavaScr ...
- docker 基本概念
image 操作系统 应用 registeries image 的远程仓库 containers 类似一个目录,一个容器包含了 应用运行所需要的一切东西, 容器之间互相独立 image包换一系列的层, ...
- FFMPEG 最简滤镜filter使用实例(实现视频缩放,裁剪,水印等)
FFMPEG官网给出了FFMPEG 滤镜使用的实例,它是将视频中的像素点替换成字符,然后从终端输出.我在该实例的基础上稍微的做了修改,使它能够保存滤镜处理过后的文件.在上代码之前先明白几个概念: Fi ...
- JS图表工具 ---- Highcharts
Highcharts 是一个用纯 JavaScript编写的一个图表库, 能够很简单便捷的在web网站或是 web 应用程序添加有交互性的图表,并且免费提供给个人学习.个人网站和非商业用途使用. Hi ...
- 洛谷【P1104】生日(冒泡排序版)
题目传送门:https://www.luogu.org/problemnew/show/P1104 题目很简单,我主要是来讲冒泡排序的. 所谓冒泡排序,流程如下: 每次确定一个\(rk\)(从\(n\ ...
- bzoj 1927 星际竞速 —— 最小费用最大流
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1927 首先注意到这是个DAG: 考虑每个点从哪里来,可以是瞬移来的,也可以是从某个点走过来的 ...
- MySQL5.7出现Your password has expired. To log in you must change it using a client that supports expir
今天晚上本来想写bootstrap-fileinput插件集成fastdfs的文章,但是刚启动idea里面的QiYuAdmin就出现了错误: Your password has expired. To ...