Quartz22版本开发手册Word下载.docx
- 文档编号:7342465
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:14
- 大小:27.25KB
Quartz22版本开发手册Word下载.docx
《Quartz22版本开发手册Word下载.docx》由会员分享,可在线阅读,更多相关《Quartz22版本开发手册Word下载.docx(14页珍藏版)》请在冰点文库上搜索。
,
null,
;
Triggertrigger=();
ET组件可以很简单地被scheduler执行。
下面是Job接口:
package;
publicinterfaceJob{
publicvoidexecute(JobExecutionContextcontext)
throwsJobExecutionException;
}这样,你会猜想出,当Job触发器触发时(在某个时刻),Execute(..)就被scheduler所调用。
JobExecutionContext对象被传递给这个方法,它为Job实例提供了它的“运行时”环境-一个指向执行这个IJob实例的Scheduler句柄,一个指向触发该次执行的触发器的句柄,IJob的JobDetail对象以及一些其他的条目。
JobDetail对象由Quartz客户端在Job被加入到scheduler时创建。
它包含了Job的各种设置属性以及一个JobDataMap对象,这个对象被用来存储给定Job类实例的状态信息。
Trigger对象被用来触发jobs的执行。
你希望将任务纳入到进度,要实例化一个Trigger并且“调整”它的属性以满足你想要的进度安排。
Triggers也有一个JobDataMap与之关联,这非常有利于向触发器所触发的Job传递参数。
Quartz打包了很多不同类型的Trigger,但最常用的Trigge类是SimpleTrigger和CronTrigger。
SimpleTrigger用来触发只需执行一次或者在给定时间触发并且重复N次且每次执行延迟一定时间的任务。
CronTrigger按照日历触发,例如“每个周五”,每个月10日中午或者10:
15分。
为什么要分为Jobs和Triggers很多任务日程管理器没有将Jobs和Triggers进行区分。
一些产品中只是将“job”简单地定义为一个带有一些小任务标识的执行时间。
其他产品则更像Quartz中job和trigger的联合。
而开发Quartz的时候,我们决定对日程和按照日程执行的工作进行分离。
(从我们的观点来看)这有很多好处。
例如:
jobs可以被创建并且存储在jobscheduler中,而不依赖于trigger,而且,很多triggers可以关联一个job.另外的好处就是这种“松耦合”能使与日程中的Job相关的trigger过期后重新配置这些Job,这样以后就能够重新将这些Job纳入日程而不必重新定义它们。
这样就可以更改或者替换trigger而不必重新定义与之相连的job标识符。
当向Quartzscheduler中注册Jobs和Triggers时,它们要给出标识它们的名字。
Jobs和Triggers也可以被放入“组”中。
“组”对于后续维护过程中,分类管理Jobs和Triggers非常有用。
Jobs和Triggers的名字在组中必须唯一,换句话说,Jobs和Triggers真实名字是它的名字+组。
如果使Job或者Trigger的组为‘null’,这等价于将其放入缺省的组中。
Quartz手册java版-(三)更多关于Jobs和JobDetails
如你所见,Job相当容易实现。
这里只是介绍有关Jobs本质,Job接口的Execute(..)方法以及JobDetails中需要理解的内容。
在所实现的类成为真正的“Job”时,期望任务所具有的各种属性需要通知给Quartz。
通过JobDetail类可以完成这个工作,这个类在前面的章节中曾简短提及过。
现在,我们花一些时间来讨论Quartz中Jobs的本质和Job实例的生命周期。
首先让我们回顾一下第一课中所看到的代码片断JobDetailjobDetail=newJobDetail("
}}注意我们传递给scheduler一个JobDetail实例,JobDetail关联一个job,提供job的class,每次scheduler执行job时,在执行execute(...)这前会创建一个实例.job必须有一个无参构造方法.
你可能想问如何提供配置job实例.或者保存job状态在执行过程中.答案是JobDataMap.它是JobDetail的一部分.
JobDataMapJobDataMap被用来保存一系列的(序列化的)对象,这些对象在Job执行时可以得到。
JobDataMap是Map接口的一个实现,而且还增加了一些存储和读取主类型数据的便捷方法。
().put("
jobSays"
"
HelloWorld!
"
);
myFloatValue"
;
myStateData"
newArrayList());
下面的代码展示了在Job执行过程中从JobDataMap获取数据的代码publicclassDumbJobimplementsJob{
publicDumbJob(){
}
throwsJobExecutionException
{
StringinstName=().getName();
StringinstGroup=().getGroup();
JobDataMapdataMap=().getJobDataMap();
StringjobSays=("
floatmyFloatValue=("
ArrayListstate=(ArrayList)("
(newDate());
"
Instance"
+instName+"
ofDumbJobsays:
+jobSays);
}}如果使用一个持久的JobStore(在本指南的JobStore章节中讨论),那么必须注意存放在JobDataMap中的内容。
因为放入JobDataMap中的内容将被序列化,而且容易出现类型转换问题。
很明显,标准.NET类型将是非常安全的,但除此之外的类型,任何时候,只要有人改变了你要序列化其实例的类的定义,就要注意是否打破了程序的兼容性。
另外,你可以对JobStore和JobDataMap采用一种使用模式:
就是只把主类型和String类型存放在Map中,这样就可以减少后面序列化的问题。
Triggers也可以有JobDataMaps与之相关联。
当scheduler中的Job被多个有规律或者重复触发的Triggers所使用时非常有用。
对于每次独立的触发,你可为Job提供不同的输入数据。
从Job执行时的JobExecutionContext中取得JobDataMap是惯用手段,它融合了从JobDetail和从Trigger中获的JobDataMap,当有相同名字的键时,它用后者的值覆盖前者值。
下面给一个例子取数据从JobExecutionContext关联JobDatMap在job执行中publicclassDumbJobimplementsJob{
JobDataMapdataMap=();
Job'
Instances'
任务“实例”这个课程的最终观点或许已经很明确,可以创建一个单独的Job类,并且通过创建多个JobDetails实例来将它的多个实例存储在scheduler中,这样每个JobDetails对象都有它自己的一套属性和JobDataMap,而且将它们都加入到scheduler中。
当触发器被触发的时候,通过Scheduler中配置的JobFactory来实例化与之关联的Job类。
缺省的JobFactory只是简单地对Job类调用newInstance()方法。
创建自己JobFactory可以利用应用中诸如Ioc或者DI容器所产生或者初始化的Job实例。
jobs的其它属性这里简短地总结一下通过JobDetail对象可以定义Job的其它属性。
Durability(持久性)-如果一个Job是不持久的,一旦没有触发器与之关联,它就会被从scheduler中自动删除。
Volatility(无常性)-如果一个Job是无常的,在重新启动Quartzischeduler时它不能被保持。
RequestsRecovery(请求恢复能力)-如果一个Job具备“请求恢复”能力,当它在执行时遇到scheduler“硬性的关闭”
(例如:
执行的过程崩溃,或者计算机被关机),那么当scheduler重新启动时,这个任务会被重新执行。
这种情况下,()属性将是true。
JobListeners(任务监听器)-一个Job如果有0个或者多个JobListeners监听器与之相关联,当这个Job执行时,监听器被会被通知。
更多有关JobListeners的讨论见TriggerListeners&
JobListeners章节。
JobExecutionException任务执行异常最后,需要告诉你一些关于(..)方法的细节。
在Execute方法被执行时,仅允许抛出一个JobExecutionException类型异常。
因此需要将整个要执行的内容包括在一个'
try-catch'
块中。
应花费一些时间仔细阅读JobExecutionException文档,因为Job能够使用它向scheduler提供各种指示,你也可以知道怎么处理异常。
Quartz手册java版-(四)关于Triggers更多内容
同Job一样,trigger非常容易使用,但它有一些可选项需要注意和理解,同时,trigger有不同的类型,要按照需求进行选择。
Calendars——日历QuartzCalendar对象在trigger被存储到scheduler时与trigger相关联。
Calendar对于在trigger触发日程中的采用批量世间非常有用。
例如:
你想要创建一个在每个工作日上午9:
30触发一个触发器,那么就添加一个排除所有节假日的日历。
Calendar可以是任何实现Calendar接口的序列化对象。
看起来如下;
package;
publicinterfaceCalendar{
publicbooleanisTimeIncluded(longtimeStamp);
publiclonggetNextIncludedTime(longtimeStamp);
}注意,这些方法的参数都是DateTime型,你可以猜想出,它们的时间戳是毫秒的格式。
这意味日历能够排除毫秒精度的时间。
最可能的是,你可能对排除整天的时间感兴趣。
为了提供方便,Quartz提供了一个,这个类可以排除整天的时间。
Calendars必须被实例化,然后通过addCalendar(..)方法注册到scheduler中。
如果使用HolidayCalendar,在实例化之后,你可以使用它的AddExcludedDate(DateTimeexcludedDate))方法来定义你想要从日程表中排除的时间。
同一个calendar实例可以被用于多个trigger中,如下:
HolidayCalendarcal=newHolidayCalendar();
(someDate);
("
myHolidays"
cal,false);
schedulejobwithtrigger
Triggertrigger2=(8,0);
schedulejobwithtrigger2
传入SimpleTrigger构造函数的参数的细节将在下章中介绍。
但是,任何在日历中被排除的时间所要进行的触发都被取消。
Priority有时,当有多个Triggers时,Quartz没有足够的资源来同时立即处理scheduled的trigger.所以你可能要控制哪个先执行.在这种情况下,你要设置Trigger的priority,如果N个triggers不会同时触发.但此时只有有限的几个线程可用.这时会先处理级别高的trigger.如果你没有设置级别,默认为5,下面为一个例子:
Calendarcal=();
5);
Triggertrig1=newSimpleTrigger("
T1"
MyGroup"
());
Triggertrig2=newSimpleTrigger("
T2"
Triggertrig3=newSimpleTrigger("
T3"
MyJob"
()会获取动态行为的详细信息.
Quartz手册java版-(六)CronTrigger
如果你需要像日历那样按日程来触发任务,而不是像SimpleTrigger那样每隔特定的间隔时间触发,CronTriggers通常比SimpleTrigger更有用。
使用CronTrigger,你可以指定诸如“每个周五中午”,或者“每个工作日的9:
30”或者“从每个周一、周三、周五的上午9:
00到上午10:
00之间每隔五分钟”这样日程安排来触发。
甚至,象SimpleTrigger一样,CronTrigger也有一个StartTime以指定日程从什么时候开始,也有一个(可选的)EndTime以指定何时日程不再继续。
Cron表达式被用来配置CronTrigger实例。
Cron表达式是一个由7个子表达式组成的字符串。
每个子表达式都描述了一个单独的日程细节。
这些子表达式用空格分隔,分别表示:
1.Seconds秒2.Minutes分钟3.Hours小时4.Day-of-Month月中的天5.Month月6.Day-of-Week周中的天7.Year(optionalfield)年(可选的域)一个cron表达式的例子字符串为"
0012*WED"
这表示“每周三的中午12:
00”。
单个子表达式可以包含范围或者列表。
前面例子中的周中的天这个域(这里是"
WED"
)可以被替换为"
MON-FRI"
MON,WED,FRI"
或者甚至"
MON-WED,SAT"
。
通配符('
*'
)可以被用来表示域中“每个”可能的值。
因此在"
Month"
域中的*表示每个月,而在Day-Of-Week域中的*则表示“周中的每一天”。
所有的域中的值都有特定的合法范围,这些值的合法范围相当明显,例如:
秒和分域的合法值为0到59,小时的合法范围是0到23,Day-of-Month中值得合法凡范围是0到31,但是需要注意不同的月份中的天数不同。
月份的合法值是0到11。
或者用字符串JAN,FEBMAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV及DEC来表示。
Days-of-Week可以用1到7来表示(1=星期日)或者用字符串SUN,MON,TUE,WED,THU,FRI和SAT来表示.
'
/'
字符用来表示值的增量,例如,如果分钟域中放入'
0/15'
,它表示“每隔15分钟,从0开始”,如果在份中域中使用'
3/20'
,则表示“小时中每隔20分钟,从第3分钟开始”或者另外相同的形式就是'
3,23,43'
字符可以用在day-of-month及day-of-week域中,它用来表示“没有指定值”。
这对于需要指定一个或者两个域的值而不需要对其他域进行设置来说相当有用。
L'
字符可以在day-of-month及day-of-week中使用,这个字符是"
last"
的简写,但是在两个域中的意义不同。
例如,在day-of-month域中的"
L"
表示这个月的最后一天,即,一月的31日,非闰年的二月的28日。
如果它用在day-of-week中,则表示"
7"
或者"
SAT"
但是如果在day-of-week域中,这个字符跟在别的值后面,则表示"
当月的最后的周XXX"
6L"
或者"
FRIL"
都表示本月的最后一个周五。
当使用'
选项时,最重要的是不要指定列表或者值范围,否则会导致混乱。
W'
字符用来指定距离给定日最接近的周几(在day-of-week域中指定)。
如果你为day-of-month域指定为"
15W"
则表示“距离月中15号最近的周几”。
#'
表示表示月中的第几个周几。
day-of-week域中的"
6#3"
FRI#3"
表示“月中第三个周五”。
例1–一个简单的每隔5分钟触发一次的表达式
00/5***"
CronTrigger例2–在每分钟的10秒后每隔5分钟触发一次的表达式(例如.10:
00:
10am,10:
05:
10等.)。
100/5***"
CronTrigger例3–在每个周三和周五的10:
30,11:
30,12:
30触发的表达式。
03010-13*WED,FRI"
CronTrigger例4–在每个月的5号,20号的8点和10点之间每隔半个小时触发一次且不包括10点,只是8:
30,9:
00和9:
30的表达式。
00/308-95,20*"
注意,对于单独触发器来说,有些日程需求可能过于复杂而不能用表达式表述,
9:
00到10:
00之间每隔5分钟触发一次,下午1:
00到10点每隔20分钟触发一次。
这个解决方案就是创建两个触发器,两个触发器都运行相同的任务。
Quartz手册java版-(七)TriggerListeners和JobListeners
监听器是在scheduler事件发生时能够执行动作的对象。
可以看出,TriggerListeners接收与triggers相关的事件,而JobListeners则接收与Job相关的事件。
Trigger相关的事件包括:
trigger触发、trigger未触发,以及trigger完成(由trigger触发的任务被完成)。
publicinterfaceTriggerListener{
publicStringgetName();
publicvoidtriggerFired(Triggertrigger,JobExecutionContextcontext);
publicbooleanvetoJobExecution(Triggertrigger,JobExecutionContextcontext);
publicvoidtriggerMisfired(Triggertrigger);
publicvoidtriggerComplete(Triggertrigger,JobExecutionContextcontext,
inttriggerInstructionCode);
}
任务相关的事件包括:
即将被执行的任务的通知和任务已经执行完毕的通知。
publicinterfaceJobListener{
publicvoidjobToBeExecuted(JobExecutionContextcontext);
publicvoidjobExecutionVetoed(JobExecutionContextcontext
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Quartz22 版本 开发 手册