2013-04-11 1 views
3

일부 Cron 트리거로 예약 할 수있는 석영 작업이 있습니다.석영 스케줄러 - 작업 간 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 

이 일을 함께 할 수 있지만, 바로 작업을 트리거 (I 원본을 유지하려면 날짜). 그래서 내 질문 :변경하지 않고 작업간에 JobDetail 또는 JobDataMap 수정할 방법이 있습니까?

저는 석영 1.6.0을 사용하고 있습니다.

답변

8

해결책은 간단하며 API를 알아야합니다.

Scheduler 클래스 boolean 인수 true로 설정된 경우 JobDetail 전달 이전에 덮어 쓰기하는 것 이하의 방법

Scheduler#addJob(JobDetail, boolean); 

있다.

그래서

// 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)으로 가져 와서 변수에 저장하면 어떨까요? 그런 다음 새 jobDataMap으로 새 작업을 만들고 이전 트리거를 사용합니까?

+0

그래, 그게 내가 처음 한 일이야. 그러나 새 작업을 예약 할 때 트리거에서 NextFireTime을 변경하는 계산을 수행하고 제 경우에는 과거에 설정하여 다시 트리거합니다. 나는 오늘 내 솔루션을 게시 할 예정이다. –