浏览 12941 次
锁定老帖子 主题:Quartz学习笔记(一)
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-05-26
最后修改:2010-05-26
1、Quartz 简介 a、Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的日程序表。Jobs可以做成标准的Java组件或 EJBs。 b、主页:http://www.quartz-scheduler.org/ c、目前最近版本:Quartz 1.8.0 Released - 04/22/2010 2、笔记记录: a、构建一个简单的 Quartz 程序 MySimpleExample.java package com.sc.quartz.myexamples; import java.util.Date; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.SimpleTrigger; import org.quartz.TriggerUtils; import org.quartz.impl.StdSchedulerFactory; public class MySimpleExample { public void run() throws SchedulerException{ // 创建调度者工厂 SchedulerFactory schedulerFactory = new StdSchedulerFactory(); // 用工厂创建一个调度者 Scheduler scheduler = schedulerFactory.getScheduler(); // 利用 Quartz 提供的 getNextGivenSecondDate 返回一个当前时间四舍五入的 5 的倍数时间 long ts = TriggerUtils.getNextGivenSecondDate(null, 5).getTime(); // 创建一个工作,并命名为‘job1’,放入‘group1’组中,HellowWorl 是在此工作中需要执行的类 JobDetail jobDetail = new JobDetail("job1","group1",HelloWorld.class); // 创建一个触发器,并命名为‘trigger1’,将此触发器设置在 ‘job1’ 上 ,并设置什么情况下启动 SimpleTrigger simpleTrigger = new SimpleTrigger("trigger1","job1", new Date(ts), null, -1, 1000L); // 将 ‘job1’ 加入调度者中, scheduler.scheduleJob(jobDetail, simpleTrigger); // 开始运行调度程序 scheduler.start(); // 停止调度程序 // scheduler.shutdown(true); } public static void main(String[] args) throws SchedulerException { MySimpleExample example = new MySimpleExample(); example.run(); } } HellowWorld.java package com.sc.quartz.myexamples; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class HelloWorld implements Job { public void execute(JobExecutionContext arg0) throws JobExecutionException { System.out.println("Hello World..."); } } 这里说下HellowWord类,此类实现了 Job 接口,重写了 Job 接口中的 execute 方法,当调度程序开始运行后,系统会自动调用 HelloWorld 的 execute 方法,也就相当于 TimerTask类中的 run 方法。 b、Quartz 支持同时运行多个 Job,他会根据 quartz.properties 初始化相应的线程 c、Quartz 支持两种触发器,分别是:SimpleTrigger 和 CronTrigger,SimpleTrigger 适合一些简单的设置,例如:从什么时候开始,到什么时候,每间隔多少时间执行一次,一共执行多少次;如果你要实现一些比较复杂定时功能,就必须用 CronTrigger 类,他支持 Unix 的语言(Unix我也不熟)“0/20 * * * * ?”。 // 表达式:从当前开始,没20秒执行一次,‘秒’ CronTrigger trigger = new CronTrigger("trigger1", "group1", "job1", "group1", "0/20 * * * * ?"); d、Quartz 中参数的设置 Quartz 中的 JobDataMap 类,提供参数的存储,此类相当于 HaspMap 类,以键/值的方式存储数据,可以通过 JobExecutionContext 上下问类来获取 JobDataMap 的实例。 // 获取上下文,并取出‘FAVORITE_COLOR’键对应的值 JobDataMap data = context.getJobDetail().getJobDataMap(); String favoriteColor = data.getString(FAVORITE_COLOR); // 为 ‘FAVORITE_COLOR’重新赋值 data.put(EXECUTION_COUNT, count); e、Quartz 可以设置打火策略 trigger.setMisfireInstruction(SimpleTrigger.MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT); f、Quartz 可以设置运行失败后就行的操作 // 报错后立即重新运行 e2.setRefireImmediately(true); // 报错后停止运行 e2.setUnscheduleAllTriggers(true); g、Quartz 跳过特殊日期 Quartz 支持在规定好的时间内将写特定时间跳过 // Add the holiday calendar to the schedule // 创建假期日期 AnnualCalendar holidays = new AnnualCalendar(); // halloween (Oct 31) Calendar halloween = new GregorianCalendar(2005, 9, 31); // 设置跳过这一天 holidays.setDayExcluded(halloween, true); // 将此 holidays 告知调度者 sched.addCalendar("holidays", holidays, false, false); h、Quartz 监听器 Quartz 支持监听器功能,目前可以监听三种状态:jobExecutionVetoed(Job执行被拒接)、jobToBeExecuted(job执行之前)、jobWasExecuted(job)执行之后。如果你想监听这些状态并想作出行为的话,需要实现 Quartz 提供的 JobListener 接口,并实现相应的方法,在其中写你要执行的程序 i、Quartz 支持插件功能 Quartz 可以通过读取xml来设置相应的参数,这样你就可以通过修改xml来修改相应的参数 org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin org.quartz.plugin.jobInitializer.fileNames = quartz_data.xml org.quartz.plugin.jobInitializer.failOnFileNotFound = true org.quartz.plugin.jobInitializer.scanInterval = 120 org.quartz.plugin.jobInitializer.wrapInUserTransaction = false j、其他 Quartz 支持读取远程DB、支持优先级的设置、服务器集群等等等等。 3、总结 Quartz 支持的功能很多,用起来比较灵活,修改配置也很方便,并且 spring 对其也有支持,提供把 Quartz 整合在项目中。因为时间比较仓促,抽出了两天的时候才看 Quartz,所以了解的还是比较简单的,如果有什么问题或者错误还希望大家指出来,以便共同探讨,及时修改。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-05-26
xiaoyuqi00 写道 因为下个项目需要用到定时器,以前写定时器用的是 Timer类,都是一些比较简单的 Task ,这次的后台 Task 比较多,并且业务也相对复杂,所有再看需求 的同时,自己了看了下Quartz,先将学习笔记总结如下:
1、Quartz 简介 a、Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的日程序表。Jobs可以做成标准的Java组件或 EJBs。 b、主页:http://www.quartz-scheduler.org/ c、目前最近版本:Quartz 1.8.0 Released - 04/22/2010 2、笔记记录: a、构建一个简单的 Quartz 程序 MySimpleExample.java package com.sc.quartz.myexamples; import java.util.Date; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.SimpleTrigger; import org.quartz.TriggerUtils; import org.quartz.impl.StdSchedulerFactory; public class MySimpleExample { public void run() throws SchedulerException{ // 创建调度者工厂 SchedulerFactory schedulerFactory = new StdSchedulerFactory(); // 用工厂创建一个调度者 Scheduler scheduler = schedulerFactory.getScheduler(); // 利用 Quartz 提供的 getNextGivenSecondDate 返回一个当前时间四舍五入的 5 的倍数时间 long ts = TriggerUtils.getNextGivenSecondDate(null, 5).getTime(); // 创建一个工作,并命名为‘job1’,放入‘group1’组中,HellowWorl 是在此工作中需要执行的类 JobDetail jobDetail = new JobDetail("job1","group1",HelloWorld.class); // 创建一个触发器,并命名为‘trigger1’,将此触发器设置在 ‘job1’ 上 ,并设置什么情况下启动 SimpleTrigger simpleTrigger = new SimpleTrigger("trigger1","job1", new Date(ts), null, -1, 1000L); // 将 ‘job1’ 加入调度者中, scheduler.scheduleJob(jobDetail, simpleTrigger); // 开始运行调度程序 scheduler.start(); // 停止调度程序 // scheduler.shutdown(true); } public static void main(String[] args) throws SchedulerException { MySimpleExample example = new MySimpleExample(); example.run(); } } HellowWorld.java package com.sc.quartz.myexamples; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class HelloWorld implements Job { public void execute(JobExecutionContext arg0) throws JobExecutionException { System.out.println("Hello World..."); } } 这里说下HellowWord类,此类实现了 Job 接口,重写了 Job 接口中的 execute 方法,当调度程序开始运行后,系统会自动调用 HelloWorld 的 execute 方法,也就相当于 TimerTask类中的 run 方法。 b、Quartz 支持同时运行多个 Job,他会根据 quartz.properties 初始化相应的线程 c、Quartz 支持两种触发器,分别是:SimpleTrigger 和 CronTrigger,SimpleTrigger 适合一些简单的设置,例如:从什么时候开始,到什么时候,每间隔多少时间执行一次,一共执行多少次;如果你要实现一些比较复杂定时功能,就必须用 CronTrigger 类,他支持 Unix 的语言(Unix我也不熟)“0/20 * * * * ?”。 // 表达式:从当前开始,没20秒执行一次,‘秒’ CronTrigger trigger = new CronTrigger("trigger1", "group1", "job1", "group1", "0/20 * * * * ?"); d、Quartz 中参数的设置 Quartz 中的 JobDataMap 类,提供参数的存储,此类相当于 HaspMap 类,以键/值的方式存储数据,可以通过 JobExecutionContext 上下问类来获取 JobDataMap 的实例。 // 获取上下文,并取出‘FAVORITE_COLOR’键对应的值 JobDataMap data = context.getJobDetail().getJobDataMap(); String favoriteColor = data.getString(FAVORITE_COLOR); // 为 ‘FAVORITE_COLOR’重新赋值 data.put(EXECUTION_COUNT, count); e、Quartz 可以设置打火策略 trigger.setMisfireInstruction(SimpleTrigger.MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT); f、Quartz 可以设置运行失败后就行的操作 // 报错后立即重新运行 e2.setRefireImmediately(true); // 报错后停止运行 e2.setUnscheduleAllTriggers(true); g、Quartz 跳过特殊日期 Quartz 支持在规定好的时间内将写特定时间跳过 // Add the holiday calendar to the schedule // 创建假期日期 AnnualCalendar holidays = new AnnualCalendar(); // halloween (Oct 31) Calendar halloween = new GregorianCalendar(2005, 9, 31); // 设置跳过这一天 holidays.setDayExcluded(halloween, true); // 将此 holidays 告知调度者 sched.addCalendar("holidays", holidays, false, false); h、Quartz 监听器 Quartz 支持监听器功能,目前可以监听三种状态:jobExecutionVetoed(Job执行被拒接)、jobToBeExecuted(job执行之前)、jobWasExecuted(job)执行之后。如果你想监听这些状态并想作出行为的话,需要实现 Quartz 提供的 JobListener 接口,并实现相应的方法,在其中写你要执行的程序 i、Quartz 支持插件功能 Quartz 可以通过读取xml来设置相应的参数,这样你就可以通过修改xml来修改相应的参数 org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin org.quartz.plugin.jobInitializer.fileNames = quartz_data.xml org.quartz.plugin.jobInitializer.failOnFileNotFound = true org.quartz.plugin.jobInitializer.scanInterval = 120 org.quartz.plugin.jobInitializer.wrapInUserTransaction = false j、其他 Quartz 支持读取远程DB、支持优先级的设置、服务器集群等等等等。 3、总结 Quartz 支持的功能很多,用起来比较灵活,修改配置也很方便,并且 spring 对其也有支持,提供把 Quartz 整合在项目中。因为时间比较仓促,抽出了两天的时候才看 Quartz,所以了解的还是比较简单的,如果有什么问题或者错误还希望大家指出来,以便共同探讨,及时修改。 Timer无论何时都不要用 简单的定时任务没有必要用quartz ScheduledExecutorService能够搞定一切 |
|
返回顶楼 | |
发表时间:2010-05-27
beneo 写道 xiaoyuqi00 写道 因为下个项目需要用到定时器,以前写定时器用的是 Timer类,都是一些比较简单的 Task ,这次的后台 Task 比较多,并且业务也相对复杂,所有再看需求 的同时,自己了看了下Quartz,先将学习笔记总结如下:
1、Quartz 简介 a、Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的日程序表。Jobs可以做成标准的Java组件或 EJBs。 b、主页:http://www.quartz-scheduler.org/ c、目前最近版本:Quartz 1.8.0 Released - 04/22/2010 2、笔记记录: a、构建一个简单的 Quartz 程序 MySimpleExample.java package com.sc.quartz.myexamples; import java.util.Date; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.SimpleTrigger; import org.quartz.TriggerUtils; import org.quartz.impl.StdSchedulerFactory; public class MySimpleExample { public void run() throws SchedulerException{ // 创建调度者工厂 SchedulerFactory schedulerFactory = new StdSchedulerFactory(); // 用工厂创建一个调度者 Scheduler scheduler = schedulerFactory.getScheduler(); // 利用 Quartz 提供的 getNextGivenSecondDate 返回一个当前时间四舍五入的 5 的倍数时间 long ts = TriggerUtils.getNextGivenSecondDate(null, 5).getTime(); // 创建一个工作,并命名为‘job1’,放入‘group1’组中,HellowWorl 是在此工作中需要执行的类 JobDetail jobDetail = new JobDetail("job1","group1",HelloWorld.class); // 创建一个触发器,并命名为‘trigger1’,将此触发器设置在 ‘job1’ 上 ,并设置什么情况下启动 SimpleTrigger simpleTrigger = new SimpleTrigger("trigger1","job1", new Date(ts), null, -1, 1000L); // 将 ‘job1’ 加入调度者中, scheduler.scheduleJob(jobDetail, simpleTrigger); // 开始运行调度程序 scheduler.start(); // 停止调度程序 // scheduler.shutdown(true); } public static void main(String[] args) throws SchedulerException { MySimpleExample example = new MySimpleExample(); example.run(); } } HellowWorld.java package com.sc.quartz.myexamples; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class HelloWorld implements Job { public void execute(JobExecutionContext arg0) throws JobExecutionException { System.out.println("Hello World..."); } } 这里说下HellowWord类,此类实现了 Job 接口,重写了 Job 接口中的 execute 方法,当调度程序开始运行后,系统会自动调用 HelloWorld 的 execute 方法,也就相当于 TimerTask类中的 run 方法。 b、Quartz 支持同时运行多个 Job,他会根据 quartz.properties 初始化相应的线程 c、Quartz 支持两种触发器,分别是:SimpleTrigger 和 CronTrigger,SimpleTrigger 适合一些简单的设置,例如:从什么时候开始,到什么时候,每间隔多少时间执行一次,一共执行多少次;如果你要实现一些比较复杂定时功能,就必须用 CronTrigger 类,他支持 Unix 的语言(Unix我也不熟)“0/20 * * * * ?”。 // 表达式:从当前开始,没20秒执行一次,‘秒’ CronTrigger trigger = new CronTrigger("trigger1", "group1", "job1", "group1", "0/20 * * * * ?"); d、Quartz 中参数的设置 Quartz 中的 JobDataMap 类,提供参数的存储,此类相当于 HaspMap 类,以键/值的方式存储数据,可以通过 JobExecutionContext 上下问类来获取 JobDataMap 的实例。 // 获取上下文,并取出‘FAVORITE_COLOR’键对应的值 JobDataMap data = context.getJobDetail().getJobDataMap(); String favoriteColor = data.getString(FAVORITE_COLOR); // 为 ‘FAVORITE_COLOR’重新赋值 data.put(EXECUTION_COUNT, count); e、Quartz 可以设置打火策略 trigger.setMisfireInstruction(SimpleTrigger.MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT); f、Quartz 可以设置运行失败后就行的操作 // 报错后立即重新运行 e2.setRefireImmediately(true); // 报错后停止运行 e2.setUnscheduleAllTriggers(true); g、Quartz 跳过特殊日期 Quartz 支持在规定好的时间内将写特定时间跳过 // Add the holiday calendar to the schedule // 创建假期日期 AnnualCalendar holidays = new AnnualCalendar(); // halloween (Oct 31) Calendar halloween = new GregorianCalendar(2005, 9, 31); // 设置跳过这一天 holidays.setDayExcluded(halloween, true); // 将此 holidays 告知调度者 sched.addCalendar("holidays", holidays, false, false); h、Quartz 监听器 Quartz 支持监听器功能,目前可以监听三种状态:jobExecutionVetoed(Job执行被拒接)、jobToBeExecuted(job执行之前)、jobWasExecuted(job)执行之后。如果你想监听这些状态并想作出行为的话,需要实现 Quartz 提供的 JobListener 接口,并实现相应的方法,在其中写你要执行的程序 i、Quartz 支持插件功能 Quartz 可以通过读取xml来设置相应的参数,这样你就可以通过修改xml来修改相应的参数 org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin org.quartz.plugin.jobInitializer.fileNames = quartz_data.xml org.quartz.plugin.jobInitializer.failOnFileNotFound = true org.quartz.plugin.jobInitializer.scanInterval = 120 org.quartz.plugin.jobInitializer.wrapInUserTransaction = false j、其他 Quartz 支持读取远程DB、支持优先级的设置、服务器集群等等等等。 3、总结 Quartz 支持的功能很多,用起来比较灵活,修改配置也很方便,并且 spring 对其也有支持,提供把 Quartz 整合在项目中。因为时间比较仓促,抽出了两天的时候才看 Quartz,所以了解的还是比较简单的,如果有什么问题或者错误还希望大家指出来,以便共同探讨,及时修改。 Timer无论何时都不要用 简单的定时任务没有必要用quartz ScheduledExecutorService能够搞定一切 以前一直用的Timer后来才发现的Quartz,抽空看了下,发现用起来很方便,功能很强大,所以决定以后就用这个了! |
|
返回顶楼 | |
发表时间:2011-02-10
有完整demo吗?能否发一个
|
|
返回顶楼 | |