2013-04-11 210 views
3

我有一個Quartz Job,我可以使用一些Cron Trigger進行調度。Quartz Scheduler - 只更新JobDataMap,作業之間

ReportSchedule reportSchedule = ... // my object 
JobDetail jobDetail = new JobDetail(reportSchedule.getScheduleName(), 
            reportSchedule.getScheduleGroup(), 
            ExtendedReportJob.class /* my job */); 

jobDetail.getJobDataMap().put("reportSchedule", reportSchedule); 
jobDetail.setDescription(reportSchedule.getScheduleDescription()); 
CronTrigger trigger = ...; // depends on the report schedule 

scheduler.scheduleJob(jobDetail, trigger); 

此代碼成功地工作和細節寫入到數據庫

reportSchedule對象包含作業所需的特定參數。但是,我可能想要更改參數。

我可以

scheduler.deleteJob(name, group); 
scheduler.scheduleJob(jobDetail, trigger); 
// where jobDetail.getJobDataMap() has the updated reportSchedule 

這樣做做到這一點,但是,將觸發作業就因爲觸發取決於該報告的日程,我不想改變它(我想保持原來的日期)。所以我的問題:有沒有辦法修改作業之間的JobDetailJobDataMap而不更改Trigger

我正在使用Quartz 1.6.0。

回答

8

該解決方案非常簡單,只需知道API。

Scheduler類具有以下方法

Scheduler#addJob(JobDetail, boolean); 

在其中如果boolean參數設置爲true傳遞JobDetail將覆蓋前一個。

所以

// name and group are the primary key of the job detail 
final JobDetail jobDetail = new JobDetail(name, group, ExtendedReportJob.class); 

// reportSchedule is the object I've previously modified 
jobDetail.getJobDataMap().put(ORStatics.REPORT_SCHEDULE, reportSchedule); 
jobDetail.setDescription(reportSchedule.getScheduleDescription()); 

// overwrite the previous job, however retaining the triggers  
scheduler.addJob(jobDetail, true); 

將更新永久存儲作業詳細信息。由於包含JobDetail的表的主鍵將保持不變,因此我們不需要更改觸發器。他們仍然會按計劃執行它。

0

getTrigger(String triggerName, String triggerGroup)獲得觸發器並將其存儲在一個變量中怎麼樣?然後用新的jobDataDataMap創建一個新的工作,並使用舊的觸發器?

+0

是的,這就是我一開始做的。但是,當您計劃一項新工作時,它會執行一些計算來改變觸發器上的NextFireTime,並且在我的情況下它會將其設置爲過去,從而重新觸發它。我今天晚些時候會發布我的解決方案。 – 2013-04-12 16:43:39

相關問題