论坛首页 Java企业应用论坛

Quartz学习笔记(一)

浏览 12941 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-05-26   最后修改:2010-05-26
  因为下个项目需要用到定时器,以前写定时器用的是 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,所以了解的还是比较简单的,如果有什么问题或者错误还希望大家指出来,以便共同探讨,及时修改。
   发表时间: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能够搞定一切
0 请登录后投票
   发表时间: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,抽空看了下,发现用起来很方便,功能很强大,所以决定以后就用这个了!
0 请登录后投票
   发表时间:2011-02-10  
有完整demo吗?能否发一个
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics