2022年Quartz学习资料 .pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《2022年Quartz学习资料 .pdf》由会员分享,可在线阅读,更多相关《2022年Quartz学习资料 .pdf(31页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Quartz 学习资料(完全)介绍 Quartz Quartz 是一个开源的任务调度系统,它能用来调度很多任务的执行。运行环境Quartz 能嵌入在其他应用程序里运行。Quartz 能在一个应用服务器里被实例化(或 servlet 容器 ), 并且参与XA 事务Quartz 能独立运行(通过JVM) ,或者通过RMI Quartz 能被集群实例化任务调度当一个指定给任务的触发器发生时,任务就被调度执行. 触发器能被创建为: 一天的某个时间(精确到毫秒级 ) 一周的某些天一个月的某些天一年的某些天不在一个Calendar 列出的某些天(例如工作节假日) 在一个指定的次数重复重复到一个指定的时间/
2、日期无限重复在一个间隔内重复能够给任务指定名称和组名.触发器也能够指定名称和组名,这样可以很好的在调度器里组织起来 .一个加入到调度器里的任务可以被多个触发器注册。在 J2EE 环境里, 任务能作为一个分布式( XA)事务的一部分来执行。任务执行任务能够是任何实现Job 接口的 Java 类。任务类能够被Quartz 实例化 ,或者被你的应用框架。当一个触发器触发时,调度器会通知实例化了JobListener 和 TriggerListener 接口的0 个或者多个Java对象 (监听器可以是简单的Java对象 , EJBs, 或 JMS 发布者等 ). 在任务执行后,这些监听器也会被通知。当
3、任务完成时,他们会返回一个JobCompletionCode ,这个代码告诉调度器任务执行成功或者失败.这个代码也会指示调度器做一些动作-例如立即再次执行任务。任务持久化名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 31 页 - - - - - - - - - Quartz 的设计包含JobStore 接口,这个接口能被实现来为任务的存储提供不同的机制。应用 JDBCJobStore, 所有被配置成“稳定”的任务和触发器能通过JDBC 存储在关系数据库里。应用 RAMJ
4、obStore, 所有任务和触发器能被存储在RAM 里因此不必在程序重起之间保存 -一个好处就是不必使用数据库。事务使用 JobStoreCMT( JDBCJobStore 的子类),Quartz 能参与 JTA 事务。Quartz 能管理 JTA 事务 (开始和提交 )在执行任务之间,这样,任务做的事就可以发生在 JTA 事务里。集群Fail-over. Load balancing. 监听器和插件通过实现一个或多个监听接口,应用程序能捕捉调度事件来监控或控制任务/触发器的行为。插件机制可以给Quartz 增加功能,例如保持任务执行的历史记录,或从一个定义好的文件里加载任务和触发器。Quar
5、tz 装配了很多插件和监听器。1.使用 Quartz 在我们用调度器之前,调度器需要实例化。我们用SchedulerFactory 来实例它。一旦调度器被实例,我们就可以启动它,置它为stand-by 模式,最后关闭它。注意:一旦一个调度器被关闭了, 如果我们不重新实例化它,它就不可能被再次启动。直到调度器启动了或者当调度器处于暂停状态,触发器才能够触发。下面有个简单的例子:SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory(); Scheduler sched = schedFact.getSchedule
6、r(); sched.start(); JobDetail jobDetail = new JobDetail(myJob,null, DumbJob.class); Trigger trigger = TriggerUtils.makeHourlyTrigger(); / 每个小时触发trigger.setStartTime(TriggerUtils.getEvenHourDate(new Date(); / 在下个小时开始trigger.setName(myTrigger); sched.scheduleJob(jobDetail, trigger);就象你看到的,使用Quartz 是很简
7、单的。在下一节我们介绍Jobs和 Triggers。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 31 页 - - - - - - - - - 2.Jobs 和 Triggers 就象以前提到的,一个实现了Job 接口的 Java类就能够被调度器执行。接口如下:package org.quartz; public interface Job public void execute(JobExecutionContext context) throws JobExecut
8、ionException; 很简的,当Job的 trigger 触发时, Job 的 execute(.)方法就会被调度器调用。被传递到这个方法里来的JobExecutionContext 对象提供了带有job 运行时的信息: 执行它的调度器句柄、触发它的触发器句柄、job 的 JobDetail 对象和一些其他的项。JobDetail 对象是 Job 在被加到调度器里时所创建的,它包含有很多的Job 属性设置,和JobDataMap 一样,可以用来存储job 实例时的一些状态信息。Trigger 对象是用来触发执行Job 的。当调度一个job 时,我们实例一个触发器然后调整它的属性来满足jo
9、b 执行的条件。触发器也有一个和它相关的JobDataMap,它是用来给被触发器触发的job 传参数的。Quartz 有一些不同的触发器类型,不过,用得最多的是SimpleTrigger和 CronTrigger 。如果我们需要在给定时刻执行一次job 或者在给定时刻触发job 随后间断一定时间不停的执行的话, SimpleTrigger 是个简单的解决办法;如果我们想基于类似日历调度的触发job的话,比如说, 在每个星期五的中午或者在每个月第10 天的 10: 15 触发 job 时,CronTrigger是很有用的。为什么用jobs 和 triggers 呢?很多任务调度器并没有任务和触发
10、器的概念,一些任务调度器简单定义一个“job”为在一个执行时间伴随一些小任务标示,其他的更像Quartz 里 job 和trigger 对象的联合体。在开发Quartz 时,开发者们决定,在调度时间表和在这上面运行的工作应该分开。这是很有用的。例如, job 能够独立于触发器被创建和储存在任务调度器里,并且,很多的触发器能够与同一个job 关联起来。 这个松耦合的另一个好处就是在与jobs 关联的触发器终止后,我们能够再次配置保留在调度器里的jobs,这样的话,我们能够再次调度这些jobs 而不需要重新定义他们。我们也可以在不重新定义一个关联到job 的触发器的情况下,修改或替代它。当 Job
11、s和 triggers 被注册到 Quartz 的调度器里时,他们就有了唯一标示符。他们也可以被放到“ groups”里, Groups 是用来组织分类jobs 和 triggers 的,以便今后的维护。在一个组里的 job 和 trigger 的名字必须是唯一的,换句话说, 一个 job 和 trigger 的全名为他们的名字加上组名。如果把组名置为” null” ,系统会自动给它置为Scheduler.DEFAULT_GROUP现在,我们大概有了一些jobs 和 triggers 的理解,随后2 节我们将根多的了解它们。3.更多关于 Jobs & JobDetails Jobs 很容易实现
12、, 这儿有更多我们需要理解的东西:jobs 的本质, job 接口的 execute(.)方法,关于 JobDetails。当我们实现的一个class 是真正的 ” job” 时, Quartz 需要知道各种job 有的属性,这是通过 JobDetail 类做到的。在没用JobDetail 之前, JobDetail 的功能的实现是通过在每个job 的实现类上加上所有的现在JobDetail 的 get 方法来实现的。 这就在每个job 类上强加了一些实名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - -
13、 - - - 第 3 页,共 31 页 - - - - - - - - - 现一样功能的代码,就显得每个job 类很笨重,于是,Quartz 开发者们就创造了JobDetail类。现在, 我们来讨论一下在Quartz 里 job 的本质和job 实例的生命周期。首先我们来看看第一节的代码片段:JobDetail jobDetail = new JobDetail(myJob, / job 名称sched.DEFAULT_GROUP, / job组名 (可以写 null 来用 default group) DumbJob.class); /要执行的java 类Trigger trigger =
14、TriggerUtils.makeDailyTrigger(8, 30); trigger.setStartTime(new Date(); trigger.setName(myTrigger); sched.scheduleJob(jobDetail, trigger);现在我们定义“DumbJob”类:public class DumbJob implements Job public DumbJob() public void execute(JobExecutionContext context) throws JobExecutionException System.err.prin
15、tln(DumbJob is executing.); 可以看到我们给调度器一个JobDetail 实例,并且,它通过job 的类代码引用这个job 来执行。每次调度器执行job 时,它会在调用job 的 execute(.)方法之前创建一个他的实例。这就带来了两个事实:一、job 必须有一个不带参数的构造器,二、在job 类里定义数据成员并没有意义,因为在每次job 执行的时候他们的值会被覆盖掉。你可能现在想要问“我怎样给一个job 实例提供属性 /配置?”和“在几次执行间我怎样能跟踪 job 的状态?”这些问题的答案是一样的:用JobDataMap- JobDetail 对象的一部分。Jo
16、bDataMap JobDataMap 能够支持任何序列化的对象,当job 执行时,这些对象能够在job 实例中可用。JobDataMap 实现了 Java Map 接口,它有一些附加的方法,这些方法用来储存和跟踪简单类型的数据。如下代码可以很快地给job 增加 JobDataMap:jobDetail.getJobDataMap().put(jobSays, Hello World!); jobDetail.getJobDataMap().put(myFloatValue, 3.141f); jobDetail.getJobDataMap().put(myStateData, new Arr
17、ayList(); 在 job 执行时,我们可以在job 里通过如下代码得到JobDataMap:public class DumbJob implements Job public DumbJob() public void execute(JobExecutionContext context) throws JobExecutionException 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 31 页 - - - - - - - - - String inst
18、Name = context.getJobDetail().getName(); String instGroup = context.getJobDetail().getGroup(); JobDataMap dataMap = context.getJobDetail().getJobDataMap(); String jobSays = dataMap.getString(jobSays);float myFloatValue = dataMap.getFloat(myFloatValue); ArrayList state = (ArrayList)dataMap.get(myStat
19、eData);state.add(new Date(); System.err.println(Instance + instName + of DumbJob says: + jobSays); 如果用一个持久JobStore(在指南JobStore 章节讨论),我们就应该注意在JobDataMap 里放些什么,因为在它里面的对象将会被序列化,并且这些对象会因此产生一些class-versioning 问题。 明显的, 标准 Java 类型应该是很安全的,但是, 任何时候某人改变了一个你已经序列化的实例的类的定义时,我们就要注意不能够破坏兼容性了。在这个方面的进一步信息可以在Java Dev
20、eloper Connection Tech Tip: Serialization In The Real World里找到。 我们能把 JDBC-JobStore 和 JobDataMap 放到一个模式里, 在那里,只有简单类型和String型能被储存在Map 里,从而消去任何以后的序列化问题。Stateful vs. Non-Stateful Jobs 触发器也有与它们关联的JobDataMaps。假设我们有一个储存在调度器里被多个触发器关联的 job,然而,对于每个独立的触发器,我想提供给job 不同的数据输入,在这个时候,JobDataMaps 就很有用了。在 job执行期间,JobD
21、ataMaps 能够在 JobExecutionContext 里获得。JobDataMap 融合在 Trigger和 JobDetail 类里, JobDataMap 里面的值能够利用key 来更新。以下例子显示,在job 执行期间从JobExecutionContext 里的 JobDataMap 得到数据:public class DumbJob implements Job public DumbJob() public void execute(JobExecutionContext context) throws JobExecutionException String instN
22、ame = context.getJobDetail().getName(); String instGroup = context.getJobDetail().getGroup(); JobDataMap dataMap = context.getJobDataMap(); / 注意:不同于以前的例子String jobSays = dataMap.getString(jobSays);float myFloatValue = dataMap.getFloat(myFloatValue); ArrayList state = (ArrayList)dataMap.get(myStateDa
23、ta);state.add(new Date(); System.err.println(Instance + instName + of DumbJob says: + jobSays); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 31 页 - - - - - - - - - StatefulJob 现在, 关于 job 状态数据的一些附加要点:一个 job 实例能定义为有状态的 或者 无状态的。无状态的jobs 仅当它们在被加入到调度器里时才存储JobDataM
24、ap。这就意味着,在jobs执行期间对JobDataMap 里数据的任何改变都会丢失,下次执行时job 将看不到这些数据。你可能会猜到,一个有状态的job 就是它的反面例子-它的 JobDataMap 是在每次执行完job后再次储存的。一个缺点就是有状态的job 不能够并发执行。换句话说,如果job 是有状态的,一个触发器尝试触发这个已经执行了的job 时,这个触发器就会等待直到这次执行结束。用实现 StatefulJob 接口来标记一个job 是有状态的。Job Instances 我们能够创建一个单独的job 类,并且通过创建多个JobDetails 实例在调度器里储存很多它的“实例定义”
25、,每个都有它自己的属性集和JobDataMap ,把它们都加入到调度器里。当一个触发器触发时, 与它关联的job 就是通过配置在调度器上的JobFactory 来实例化的。默认的 JobFactory 简单的调用在job 类上的 newInstance()方法,你可能想要创建自己的JobFactory 实现来完成一些自己想要的事情,如:拥有应用程序的IoC 或者 DI 容器进程 /初始化 job 实例。job 的其他属性这儿有一个其他属性的总结,这些属性是通过JobDetail 对象为一个job 实例定义的。持久性 如果一个job 是非持久的,一旦没有任何可用的触发器与它关联时,他就会自动得从
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年Quartz学习资料 2022 Quartz 学习 资料
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内