在動態改變Quartz的調度時間(1)中,使用刪除Job然後重新加載實現動態改變調度週期,今天,我自己仔細看了下Quartz的API,發現用另一個方法可以實現這個功能。
版本:
1.8.6
相關鏈接:
API:http://quartz-scheduler.org/api/1.8.0/
http://quartz-scheduler.org/documentation/quartz-1.x/cookbook/UpdateTrigger
相關方法:
rescheduleJob
Date rescheduleJob(String triggerName, String groupName, Trigger newTrigger) throws SchedulerException
-
Remove (delete) the
with the given name, and store the new given one - which must be associated with the same job (the new trigger must have the job name & group specified) - however, the new trigger need not have the same name as the old trigger.Trigger
(刪除給定名稱的觸發器,並且保存新的觸發器,新舊觸發器的名字相不相同無所謂的。)
-
- Parameters:
triggerName
- The name of theTrigger
to be replaced.(要替換的觸發器的名字)groupName
- The group name of theTrigger
to be replaced.(要替換的觸發器所在組的名稱)newTrigger
- The newTrigger
to be stored.(新觸發器)- Returns:
null
if aTrigger
with the given name & group was not found and removed from the store, otherwise the first fire time of the newly scheduled trigger.- Throws:
SchedulerException
具體代碼:
/**
* 動態修改任務的執行週期
* @param jobName 任務名稱
* @param time 執行週期
* @throws SchedulerException
* @throws ParseException
*/
public static boolean modifyJobTime(String jobName, String time) throws SchedulerException, ParseException{
boolean flag = false;
Scheduler sched = sf.getScheduler();
JobDetail jobDetail = sched.getJobDetail(jobName, JOB_GROUP_NAME);
if(jobDetail != null){
Trigger trigger = (CronTrigger)sched.getTrigger(jobDetail.getName(),JOB_TRIGGER_GROUP_NAME);
if(trigger != null){
CronTrigger ctrigger = (CronTrigger)trigger;
String timeOld = ctrigger.getCronExpression();
if(!timeOld.equalsIgnoreCase(time)){
System.out.println("修改任務:"+jobName+"now:"+time);
// 修改Trigger
ctrigger.setCronExpression(time);
/**
* 更新trigger
* sched.rescheduleJob(triggerName, triggerGroupName, newTrigger)
*/
sched.rescheduleJob(jobName, JOB_TRIGGER_GROUP_NAME, ctrigger);
flag = true;
}
}
}
return flag;
}
注:sched.rescheduleJob(jobName, JOB_TRIGGER_GROUP_NAME, ctrigger); 此處jobName就是triggerName,值都一樣的。