Quartz实现任务调度和调度管理 Quartz是Java里流行的一种开源任务调度框架。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样简单复杂的日程表。Jobs可以做成标准的Java组件或 EJBs.本文会先大概介绍一下如何使用Quartz,然后重点是介绍实际项目里,通过二次开发,增加任务调度的可管理性和异常处理,使它具备一定的商业任务调度框架的功能
Quartz要求一个任务必须实现接口Job的execute方法,如下一个简单的Job:
import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class SimpleJob implements Job { public SimpleJob() { } public void execute(JobExecutionContext context) throws JobExecutionException { try { Thread.sleep(1000*20); } catch (InterruptedException e) { e.printStackTrace(); } } } Quartz将任务和时间触发分开,因此,你还需要指定时间触发,通常采用Cron方式,如每天早上六点,也可以指定某个固定时间,如2008年8月8号等。 如以下即指定每天早上六点 CronTrigger cronTrigger = new CronTrigger("triggerName", "triggerGroup"); try { CronExpression cexp = new CronExpression("0 6 * * * "); cronTrigger.setCronExpression(cexp); } catch (Exception e) { e.printStackTrace(); } Scheduler 类负责将时间触发指定给JobDetail,简单的来说JobDetail封装了你的任务,并可以提供任务名,所属组,以及附加的一些参数,代码如下: SchedulerFactory sf = new StdSchedulerFactory(); Scheduler sched = sf.getScheduler(); JobDetail job = new JobDetail("jobName", "groupName", SimpleJob.class); Scheduler.scheduleJob(job, cronTrigger); Job在被触发的时候,会通过反射实例化SimpleJob.class(因此你的Job必须有一个无参数的构造函数),并调用execute方法。 对于上列的SimpleJob,可以从execute方法输入参数context里获取一些属性,如任务名(如例子里的jobName),所在组(如:groupName).更重要的是,context里可以包含你指定的参数,如我们想让SimpleJob在运行的时候休眠时间为50秒,也可以这么写: public void execute(JobExecutionContext context) throws JobExecutionException { try { int sleep = context.getJobDetail().getJobDataMap().getInt("sleep"); Thread.sleep(1000*sleep); } catch (InterruptedException e) { e.printStackTrace(); } } 参数Sleep将由调度框架传入,如下 SchedulerFactory sf = new StdSchedulerFactory(); Scheduler sched = sf.getScheduler(); JobDetail job = new JobDetail("job1", "group1", SimpleJob.class); job.getJobDataMap().put("sleep", 50); Scheduler.scheduleJob(job, trigger);
|
|
||||
|
|
||||
|
|
|
||||
|
|
||||
|
|
|
||||
|
|
||||
|
|