動態改變Quartz的調度時間(2)

動態改變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 Trigger 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.

(刪除給定名稱的觸發器,並且保存新的觸發器,新舊觸發器的名字相不相同無所謂的。)

Parameters:
triggerName - The name of the Trigger to be replaced.(要替換的觸發器的名字)
groupName - The group name of the Trigger to be replaced.(要替換的觸發器所在組的名稱)
newTrigger - The new Trigger to be stored.(新觸發器)
Returns:
null if a Trigger 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,值都一樣的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章