|
Posted on 2009-12-13 23:29 Gavin.lee 閱讀(887) 評論(0) 編輯 收藏 所屬分類: SSH2 --Spring
參考:http://www.aygfsteel.com/steady/archive/2007/08/02/134017.html
Quartz 是一個強大的企業級 Schedule 工具,也是目前最好的開源 Schedule 工具。Spring中也集成了quartz的應用
Job:
org.quartz.Job是一個接口,只定義了void execute(JobExecutionContext context)throws JobExecutionException;一個方法。當定時任務被觸發后,系統會自動調用實現了該接口的方法。
Trigger:
trigger就是觸發器。Quartz有個很好的想法就是分離了任務和任務執行的條件。Trigger就是控制任務執行條件的類,當Trigger認為執行條件滿足的時刻,Trigger會通知相關的Job去執行。分離的好處是:
1.你可以為某個Job關聯多個Trigger,其中任何一個條件滿足都可以觸發job執行,這樣可以完成一些組合的高級觸發條件
2.當Trigger失效后(比如:一個永遠都不能滿足的條件),你不必去聲明一個新的job,代替的是你可以為job關聯一個新的Trigger讓job可以繼續執行。
目前的Quartz實現中,存在兩種Trigger,SimpleTrigger和CronTrigger,SimpleTrigger是簡單觸發器,如從某日到某日,每個一定時間進行一次提醒,在這段時間內進行多少次提醒;CronTrigger是復雜觸發器,用來執行calendar-like的任務,可設定一些復雜的觸發規則,如每年的x月的第y個星期五,或是每個星期天的幾點進行提醒。后面附加一個日常語義與cronTrigger的轉化
Scheduler:
Scheduler 是一個計劃集,其中可以包含多個 JobDetail 和 Trigger 組成的計劃任務。
在Quartz中,我們可以通過
SchedulerFactory scheduleFactory = new StdSchedulerFactory();
Scheduler scheduler = scheduleFactory.getScheduler();
來取得scheduler,通過調用scheduler.start()來啟動quartz。
具體的詳細應用看(Quartz Job Scheduling Framework 中文版 V0.9.5.chm) 文檔
任務調度管理類:
package com.yixun.wap.quartz;

import java.text.ParseException;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;

 /** *//**
* @Title:Quartz管理類
*/
 public class QuartzManager {
private static SchedulerFactory sf = new StdSchedulerFactory();

private static String JOB_GROUP_NAME = "group1";

private static String TRIGGER_GROUP_NAME = "trigger1";

 /** *//**
* 添加一個定時任務,使用默認的任務組名,觸發器名,觸發器組名
* @param jobName 任務名
* @param job 任務
* @param time 時間設置,參考quartz說明文檔
* @throws SchedulerException
* @throws ParseException
*/
 public static void addJob(String jobName, Job job, String time) throws SchedulerException, ParseException {
Scheduler sched = sf.getScheduler();
JobDetail jobDetail = new JobDetail(jobName, JOB_GROUP_NAME, job.getClass());//任務名,任務組,任務執行類
//觸發器
CronTrigger trigger = new CronTrigger(jobName, TRIGGER_GROUP_NAME);//觸發器名,觸發器組
trigger.setCronExpression(time);//觸發器時間設定
sched.scheduleJob(jobDetail, trigger);
//啟動
if (!sched.isShutdown())
sched.start();
}

 /** *//**
* 添加一個定時任務
* @param jobName 任務名
* @param jobGroupName 任務組名
* @param triggerName 觸發器名
* @param triggerGroupName 觸發器組名
* @param job 任務
* @param time 時間設置,參考quartz說明文檔
* @throws SchedulerException
* @throws ParseException
*/
 public static void addJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName, Job job, String time) throws SchedulerException, ParseException {
Scheduler sched = sf.getScheduler();
JobDetail jobDetail = new JobDetail(jobName, jobGroupName, job.getClass());//任務名,任務組,任務執行類
//觸發器
CronTrigger trigger = new CronTrigger(triggerName, triggerGroupName);//觸發器名,觸發器組
trigger.setCronExpression(time);//觸發器時間設定
sched.scheduleJob(jobDetail, trigger);
if (!sched.isShutdown())
sched.start();
}

 /** *//**
* 修改一個任務的觸發時間(使用默認的任務組名,觸發器名,觸發器組名)
* @param jobName
* @param time
* @throws SchedulerException
* @throws ParseException
*/
 public static void modifyJobTime(String jobName, String time) throws SchedulerException, ParseException {
Scheduler sched = sf.getScheduler();
Trigger trigger = sched.getTrigger(jobName, TRIGGER_GROUP_NAME);
 if (trigger != null) {
CronTrigger ct = (CronTrigger) trigger;
ct.setCronExpression(time);
sched.resumeTrigger(jobName, TRIGGER_GROUP_NAME);
}
}

 /** *//**
* 修改一個任務的觸發時間
* @param triggerName
* @param triggerGroupName
* @param time
* @throws SchedulerException
* @throws ParseException
*/
 public static void modifyJobTime(String triggerName, String triggerGroupName, String time) throws SchedulerException, ParseException {
Scheduler sched = sf.getScheduler();
Trigger trigger = sched.getTrigger(triggerName, triggerGroupName);
 if (trigger != null) {
CronTrigger ct = (CronTrigger) trigger;
//修改時間
ct.setCronExpression(time);
//重啟觸發器
sched.resumeTrigger(triggerName, triggerGroupName);
}
}

 /** *//**
* 移除一個任務(使用默認的任務組名,觸發器名,觸發器組名)
* @param jobName
* @throws SchedulerException
*/
 public static void removeJob(String jobName) throws SchedulerException {
Scheduler sched = sf.getScheduler();
sched.pauseTrigger(jobName, TRIGGER_GROUP_NAME);//停止觸發器
sched.unscheduleJob(jobName, TRIGGER_GROUP_NAME);//移除觸發器
sched.deleteJob(jobName, JOB_GROUP_NAME);//刪除任務
}

 /** *//**
* 移除一個任務
* @param jobName
* @param jobGroupName
* @param triggerName
* @param triggerGroupName
* @throws SchedulerException
*/
 public static void removeJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName) throws SchedulerException {
Scheduler sched = sf.getScheduler();
sched.pauseTrigger(triggerName, triggerGroupName);//停止觸發器
sched.unscheduleJob(triggerName, triggerGroupName);//移除觸發器
sched.deleteJob(jobName, jobGroupName);//刪除任務
}
}

具體任務調度:
package com.yixun.wap.quartz;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

 public class TestJob implements Job {
 public void execute(JobExecutionContext arg0) throws JobExecutionException {
System.out.println("★★★★★★★★★★★");
}

}
任務調用測試:
package com.yixun.wap.quartz;

 public class QuartzTest {

 public static void main(String[] args) {
TestJob job = new TestJob();
String job_name = "11";
 try {
System.out.println("【系統啟動】");
QuartzManager.addJob(job_name, job, "0/5 * * * * ?");
Thread.sleep(10000);
System.out.println("【修改時間】");
QuartzManager.modifyJobTime(job_name, "0/10 * * * * ?");
Thread.sleep(20000);
System.out.println("【移除定時】");
QuartzManager.removeJob(job_name);
Thread.sleep(10000);

System.out.println("\n【添加定時任務】");
QuartzManager.addJob(job_name, job, "0/5 * * * * ?");

 } catch (Exception e) {
e.printStackTrace();
}
}
}

|