分享
 
 
 

Quartz,企业级的计划/日程安排(job schedule)系统(1)-介绍

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

什么是job schedule system?

job schedule system是负责在预定义的时间执行或者通知某个应用组件的系统。举个例子来说,比如在每周一早上9:30发送email通知客户最新的业务情况。

java.util.Timer和java.util.TimerTask

Timer和TimerTask是可以完成job schedule的两个jdk提供的类,不过这不能称为一个system。Timer和TimerTask是很简单的,不直接支持持久化任务,线程池和类似日历(calendar-like)的计划安排,在完成一些高级功能上开发人员要进行大量的扩展。

Quartz的简单介绍

Quartz是opensymphony组织专攻job scheduling领域又一个开源利器,可以到http://www.opensymphony.com/quartz查看详细信息。Quartz是轻量级的组件,开发人员只需要加载单独的jar包就可以利用Quartz强大的日程安排功能。当然,假如你为Quartz配备了数据库持久化任务的特性,Quartz也可以很好的利用这一点,从而在机器重启后还能够记住你原先安排的计划。

Quartz中我们接触最多的接口使Scheduler接口,该接口的提供了计划安排的功能,比如schedule/unschedule计划、start/pause/stop Scheduler.

Quartz提供一些常用的Listener(JobListener,TriggerListener,SchedulerListener)用于完全的监视计划安排和执行情况。

开始我们的Quartz之旅

HelloWorld example:想必大家很想看一个HelloWorld的例子了吧,那么还是以HellowWorld开始。

import java.util.Date;

import org.quartz.Job;

import org.quartz.JobDetail;

import org.quartz.JobExecutionContext;

import org.quartz.JobExecutionException;

import org.quartz.Scheduler;

import org.quartz.SchedulerFactory;

import org.quartz.Trigger;

import org.quartz.impl.StdSchedulerFactory;

/**

* @author snowway

* @version $Id$

*/

public class SayHelloWorldJob implements Job{

/*

* (non-Javadoc)

*

* @see org.quartz.Job#execute(org.quartz.JobExecutionContext)

*/

public void execute(JobExecutionContext context) throws JobExecutionException{

System.out.println("hello world!");

}

public static void main(String[] args) throws Exception{

SchedulerFactory factory = new StdSchedulerFactory();

Scheduler scheduler = factory.getScheduler();

JobDetail jobDetail = new JobDetail("SayHelloWorldJob",

Scheduler.DEFAULT_GROUP,

SayHelloWorldJob.class);

Trigger trigger = new SimpleTrigger("SayHelloWorldJobTrigger",

Scheduler.DEFAULT_GROUP,

new Date(),

null,

0,

0L);

scheduler.scheduleJob(jobDetail, trigger);

scheduler.start();

}

}

为了简单起见,我把main方法写在SayHelloWorldJob中了,执行SayHelloWorldJob可以看到控制台打印hello world.

回顾Hello World example: Job是什么?

接口Job是每个业务上需要执行的任务需要实现的接口,该接口只有一个方法:

package org.quartz;

public interface Job {

public void execute(JobExecutionContext context)

throws JobExecutionException;

}

execute方法也就是当时间到达后,Quartz回调的方法,我们使SayHelloWorldJob实现Job接口以提供打印功能

JobDetail是什么?

JobDetail描述了一个任务具体的信息,比如名称,组名等等。

JobDetail jobDetail = new JobDetail("SayHelloWorldJob",

Scheduler.DEFAULT_GROUP,

SayHelloWorldJob.class);

在上面的构造方法中,第一个是任务的名称,第二个是组名,第三个就是实际当任务需要执行的回调类。

Trigger是什么?

Trigger顾名思义就是触发器,Quartz有个很好的想法就是分离了任务和任务执行的条件。Trigger就是控制任务执行条件的类,当Trigger认为执行条件满足的时刻,Trigger会通知相关的Job去执行。分离的好处是:

1.你可以为某个Job关联多个Trigger,其中任何一个条件满足都可以触发job执行,这样可以完成一些组合的高级触发条件

2.当Trigger失效后(比如:一个永远都不能满足的条件),你不必去声明一个新的job,代替的是你可以为job关联一个新的Trigger让job可以继续执行。

目前的Quartz实现中,存在两种Trigger,SimpleTrigger和CronTrigger,SimpleTrigger用来完成一些比如固定时间执行的任务,比如:从现在开始1分钟后等等;而CronTrigger(没错,和unix的cron进程的含意一样)用来执行calendar-like的任务,比如:每周五下午3:00,每月最后一天等等。

Trigger trigger = new SimpleTrigger("SayHelloWorldJobTrigger",

Scheduler.DEFAULT_GROUP,

new Date(),

null,

0,

0L);

这个构造方法中,第一个是Trigger的名称,第二个是Trigger的组名,第三个是任务开始时间,第四个是结束时间,第五个是重复

次数(使用SimpleTrigger.REPEAT_INDEFINITELY常量表示无限次),最后一个是重复周期(单位是毫秒),那么这样就创建

了一个立刻并只执行一次的任务。

scheduler.scheduleJob(jobDetail, trigger);

这条语句就是把job和Trigger关联,这样当Trigger认为应该触发的时候就会调用(实际上是Scheduler调用)job.execute方法了。

scheduler.start();

千万别忘了加上上面的语句,这条语句通知Quartz使安排的计划生效。

关于execute方法的参数JobExecutionContext

JobExecutionContext就和很多Context结尾的类功能一样,提供的运行时刻的上下文环境,JobExecutionContext中有

Scheduler,JobDetail,Trigger等很多对象的引用,从而当你在execute方法内部须需要这些对象的时刻提供的便利。

JobDetail和Trigger的name和group

Scheduler实例对应了很多job和trigger的实例,为了方便的区分,Quartz使用name和group这两个特性,正如你想向的一样,

同一个group下不能有两个相同name的JobDetail,Trigger同理

同一个Scheduler下不能有两个相同group的JobDetail,Trigger同理

JobDetail和Trigger的完全限定名为:group + name

更深入的思考...

HelloWorld的例子还不足以说明一些问题,一些人可能会这样问:假如execute方法中需要一些额外的数据怎么办?比如说execute

中希望发送一封邮件,但是我需要知道邮件的发送者、接收者等信息?

存在两种解决方案:

1.JobDataMap类:

每个JobDetail都关联了一个JobDataMap实例,JobDataMap是java.util.Map的子类,基本上是提供key-value形式的数据,并提供了一些便利方法(主要是对java基本数据类型的支持,如put(String key,int value)),当开发人员创建JobDetail的时候,可以把附加信息放到JobDataMap中,那么在execute方法中可以根据key找到需要的值。

JobDetail job = new JobDetail....

job.getJobDataMap().put("from","snowway@vip.sina.com");

...

在execute中

String from = jobExecutionContext.getJobDetail().getJobDataMap().getString("from");

....

不过,当你使用数据库存储JobDetail的时候(默认情况下使用RAM),这里有一个致命的弱点,你不能把没有实现java.io.Serializable的对象放入JobDataMap中,因为Quartz将使用Blob字段保存(也可以通过配置文件关闭)序列化过的JobDataMap中的对象。比如你在execute方法中需要一个java.sql.Connection接口实例,这种情况也是普遍的,那么通常情况下你不能把Connection放入JobDataMap,即使你只想在execute中使用。(注:读者可暂时认为上面这段话是正确的,然而可以通过指示quartz改变这种行为,那属于高级话题)

2.假如你需要一个java.sql.Connection,用于在execute中完成某些操作,那么你可以把Connection放入Quartz的SchedulerContext中,execute也可以访问,并且Quartz不会持久化SchedulerContext中的任何东西。

scheduler.getContext().put("java.sql.Connection",connection);

execute中

Connection con = (Connection)jobExecutionContext.getScheduler().getContext().get("java.sql.Connection");

未完待续...

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有