Quartz使用培训.ppt_第1页
Quartz使用培训.ppt_第2页
Quartz使用培训.ppt_第3页
Quartz使用培训.ppt_第4页
Quartz使用培训.ppt_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Quartz定时器,2,Quartz是什么 Quartz能干什么 Easy example Quartz框架分析 项目开发,3,Quartz是什么?,Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的日程序表。Jobs可以做成标准的Java组件或 EJBs。 Quartz是一个任务日程管理系统,一个在预先确定(被纳入日程)的时间到达时,负责执行(或者通知)其他软件组件的系统。 Quartz用一个小Java库发布文件

2、(.jar文件),这个库文件包含了所有Quartz核心功能。这些功能的主要接口(API)是Scheduler接口。它提供了简单的操作,例如:将任务纳入日程或者从日程中取消,开始/停止/暂停日程进度。,4,Quartz能干什么?,场景 #1: 下载交易流水 从银行下载当日交易流水 场景 #2: 邮件提醒和告警 公司出于安全考虑,让每个员工三个月换一次邮箱密码。这种情况下,可以创建一个作业,让它每天午夜运行一次,并且向离过期时间不到三天的所有用户发邮件提醒。这里可以恰到好处的用到作业调度器。图 1.1 描绘了密码这个提醒作业。 图 1.1 密码过期的作业每晚发送邮件给密码很快会过期的用户,5,Ea

3、sy example,/ First we must get a reference to a scheduler SchedulerFactory sf = new StdSchedulerFactory(); Scheduler sched = sf.getScheduler(); / computer a time that is on the next round minute Date runTime = TriggerUtils.getEvenMinuteDate(new Date(); / define the job and tie it to our HelloJob cla

4、ss JobDetail job = new JobDetail(job1, group1, HelloJob.class); / Trigger the job to run on the next round minute Trigger trigger = new SimpleTrigger(trigger1, group1, runTime); / Tell quartz to schedule the job using our trigger sched.scheduleJob(job, trigger); / Start up the scheduler sched.start(

5、);,6,下载=,下载:/download/index.html docs/wikidocs Quartz 的帮助文件 docs/api Quartz 框架的JavaDoc Api 说明文档 Examples Quartz 的例子 Lib Quartz使用到的第三方包 src源码,7,Quartz框架分析,核心接口 Scheduler Job JobDetail Trigger JobDataMap,8,Scheduler(调度器),A Scheduler maintains a registery of org.quartz.Job

6、Details and Triggers. Once registered, the Scheduler is responible for executing Job s when their associated Triggers fire (when their scheduled time arrives). void addJob(JobDetail jobDetail, boolean replace) throws SchedulerException; Date scheduleJob(Trigger trigger) throws SchedulerException; Da

7、te scheduleJob(JobDetail jobDetail, Trigger trigger) throws SchedulerException; Date rescheduleJob(String triggerName, String groupName, Trigger newTrigger) throws SchedulerException;,9,Scheduler(调度器),客服端与调度器交互是通过 org.quartz.Scheduler 接口的。这个 Scheduler 的实现,实际上是一个代理,对其中方法调用会传递到 QuartzScheduler 实例上。Qua

8、rtzScheduler 处在框架根的位置,它是一个引擎驱动着整个框架。Quartz相当灵活和可配置,许多重要的功能由分离的组件和子框架实现,所以并非所有的功能都直接内建到 QuartzScheduler。这就意味着用户可以用自己某个关键特征实现来替换原有默认实现。,10,Scheduler实例化,使用scheduler之前应首先实例化它。使用SchedulerFactory可以完成scheduler的实例化。 org.quartz.impl.DirectoSchedulerFactory org.quartz.impl.StdSchedulerFactory StdSchedulerFact

9、ory会加载类路径下的perties 文件。perties,允许你修改框架运行时环境。缺省是使用Quartz.jar里面的perties文件。当然,你应该创建一个perties文件的副本并且把它放入你工程的classes目录中以便类装载器找到它。,11,Scheduler启动关闭,一旦一个scheduler被实例化,它就可以被启动(start),并且处于驻留模式,直到被关闭(shutdown)。注意,一旦scheduler被关闭(shutdown),则它不能再重新启动,除非重新实例化它。除非scheduler 被启

10、动并且不处于暂停状态,否则触发器不会被触发(任务也不能被执行)。 void start() throws SchedulerException; void startDelayed(int seconds) throws SchedulerException; void shutdown() throws SchedulerException; void shutdown(boolean waitForJobsToComplete) throws SchedulerException;,12,Job,作业是一个执行任务的简单java类。任务可以是任何java代码。只需你实现org.quartz

11、.Job接口。当Quartz确定该是作业运行的时候,它将调用你的作业。Quartz提供了一个机制来建立具有不同粒度的、可重复的调度表,于是,你只需创建一个java类,这个类被调用而执行任务。 public interface Job void execute(JobExecutionContext context) throws JobExecutionException; ,13,JobDetail,JobDetail对象由Quartz客户端在Job被加入到scheduler时创建。它包含了Job的各种设置属性以及一个JobDataMap对象,这个对象被用来存储给定Job类实例的状态信息。S

12、cheduler并不保存真正的Job Class,而是通过JobDetail来保存。 注意,我们给scheduler传入了一个JobDetail实例,而且这个JobDetail实例只是简单提供了类名来引用被执行的Job。每次scheduler执行这个任务时,它就创建这个类的新实例,然后调用该实例的execute(.)方法。Job不必担心线程安全性,因为同一时刻仅有一个线程去执行给定Job类的实例,甚至是并发执行同一Job也是如此。 推断: Job类必须有一个无参数的构造函数 Job类中定义的成员数据失去意义,因为这些成员数据值在每次执行的时候被“清空”了。,14,JobFactory,JobF

13、actory控制job的实例化 Job newJob(TriggerFiredBundle bundle) throws SchedulerException; 默认的JobFactory是org.quartz.simpl.SimpleJobFactory,缺省的JobFactory只是简单地对Job类调用newInstance()方法。 设置JobFactory: Scheduler.setJobFactory(factory) 配置perties的org.quartz.scheduler.jobFactory.class属性设置jobFactory的类型,15,JobD

14、ataMap,JobDataMap被用来保存一系列的(序列化的)对象,这些对象在Job执行时可以得到。JobDataMap是Java Map接口的一个实现,而且还增加了一些存储和读取主类型数据的便捷方法。 JobDetail.getJobDataMap().put(jobSays, Hello World!); JobExecutionContext.getJobDetail().getJobDataMap(); Trigger.getJobDataMap(); JobExecutionContext.getMergedJobDataMap();,16,StatefulJob有状态任务,任务在

15、执行任务过程中,任何对Job Data Map所作的更改都将丢失而且任务下次执行时也无法看到。 StatefulJob在任务的每次执行之后重新存储JobDataMap Job vs. StatefulJob JobDataMap 在每次执行之后重新持久化到 JobStore 中。 两个或多个有状态的 JobDetail 实例不能并发执行。,17,Trigger,Trigger对象被用来触发jobs的执行。你希望将任务纳入到进度,要实例化一个Trigger并且“调整”它的属性以满足你想要的进度安排。Triggers也有一个JobDataMap与之关联,这非常有利于向触发器所触发的Job传递参数。

16、Quartz打包了很多不同类型的Trigger,但最常用的Trigger类是SimpleTrigger和CronTrigger。,18,SimpleTrigger,SimpleTrigger用来触发只需执行一次或者在给定时间触发并且重复N次且每次执行延迟一定时间的任务。 如果你想让触发器在2010年1月11日,上午11:23:54秒执行,然后每个隔10秒钟重复执行一次,并且这样重复5次。那么SimpleTrigger 就可以满足你的要求。 public SimpleTrigger(String name, String group, String jobName, String jobGrou

17、p, Date startTime, Date endTime, int repeatCount, long repeatInterval);,19,CronTrigger,如果你需要像日历那样按日程来触发任务,而不是像SimpleTrigger 那样每隔特定的间隔时间触发,CronTriggers通常比SimpleTrigger更有用。 使用CronTrigger,你可以指定诸如“每个周五中午”,或者“每个工作日的9:30”或者“从每个周一、周三、周五的上午9:00到上午10:00之间每隔五分钟”这样日程安排来触发。甚至,象SimpleTrigger一样,CronTrigger也有一个sta

18、rtTime以指定日程从什么时候开始,也有一个(可选的)endTime以指定何时日程不再继续。 public CronTrigger(String name, String group, String jobName, String jobGroup, Date startTime, Date endTime, String cronExpression, TimeZone timeZone) throws ParseException;,20,Cron Expressions,Cron表达式被用来配置CronTrigger实例。Cron表达式是一个由7个子表达式组成的字符串。每个子表达式都描

19、述了一个单独的日程细节。这些子表达式用空格分隔,分别表示: Seconds 秒 Minutes 分钟 Hours 小时 Day-of-Month 月中的天 Month 月 Day-of-Week 周中的天 Year (optional field) 年,Cron Expressions,0 0 12 * * ?每天12点触发 0 15 10 ? * *每天10点15分触发 0 15 10 * * ?每天10点15分触发 0 15 10 * * ? *每天10点15分触发 0 15 10 * * ? 20052005年每天10点15分触发 0 * 14 * * ?每天下午的 2点到2点59分每分

20、触发 0 0/5 14 * * ?每天下午的 2点到2点59分(整点开始,每隔5分触发) 0 0/5 14,18 * * ?每天下午的 2点到2点59分(整点开始,每隔5分触发) 0 0-5 14 * * ?每天下午的 2点到2点05分每分触发 0 10,44 14 ? 3 WED3月分每周三下午的 2点10分和2点44分触发 0 15 10 ? * MON-FRI从周一到周五每天上午的10点15分触发 0 15 10 15 * ?每月15号上午10点15分触发 0 15 10 L * ?每月最后一天的10点15分触发 0 15 10 ? * 6L每月最后一周的星期五的10点15分触发 0 1

21、5 10 ? * 6L 2002-2005从2002年到2005年每月最后一周的星期五的10点15分触发 0 15 10 ? * 6#3每月的第三周的星期五开始触发 0 0 12 1/5 * ?每月的第一个中午开始每隔5天触发一次 0 11 11 11 11 ?每年的11月11号 11点11分触发,22,TriggerUtils,TriggerUtils 提供了许多便捷的方法简化了构造和配置 trigger。 public static Trigger makeSecondlyTrigger(int intervalInSeconds); public static Trigger makeD

22、ailyTrigger(int hour, int minute); public static Trigger makeWeeklyTrigger(int dayOfWeek, int hour, int minute); public static Trigger makeMonthlyTrigger(int dayOfMonth, int hour, int minute); public static Date getNextGivenMinuteDate(Date date, int minuteBase); public static Date getEvenMinuteDate(

23、Date date);,23,JobStore作业存储,Quartz提供两种基本作业存储类型。 第一种类型叫做RAMJobStore,它利用通常的内存来持久化调度程序信息。这种作业存储类型最容易配置、构造和运行。对许多应用来说,这种作业存储已经足够了。然而,因为调度程序信息是存储在被分配给JVM的内存里面,所以,当应用程序停止运行时,所有调度信息将被丢失。如果你需要在重新启动之间持久化调度信息,则将需要第二种类型的作业存储。 第二种类型的作业存储实际上提供两种不同的实现,但两种实现一般都称为JDBC作业存储。两种JDBC作业存储都需要JDBC驱动程序和后台数据库来持久化调度程序信息。这两种类型

24、的不同在于你是否想要控制数据库事务或这释放控制给应用服务器例如BEAs WebLogic或Jboss。 org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.impl.jdbcjobstore.JobStoreCMT,24,TriggerListeners和JobListeners,监听器是在scheduler事件发生时能够执行动作的对象。可以看出,TriggerListeners接收与triggers相关的事件,而JobListeners则接收与Job相关的事件。 创建监听器很简单,创建一个实现TriggerListener或JobListener的接口。监听器然后在执行的时候注册到scheduler中,而且必须给定一个名字(或者,它们必须通过他们的getName()方法来介绍自己)。监听器可以被注册为“全局”的或者“非全局”。“全局”监听器接收所有triggers/jobs产生的事件,而“非全局”监听器只接受那些显式指定监听器名的trigg

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论