2012-05-09 2 views
1

년 값이 포함 된 CronTrigger를 사용하여 Quartz에서 작업을 예약하는 이상한 동작을 관찰하고 있습니다. 대한 크론 식을 계산cronTrigger를 연도 값이 포함 된 식으로 사용할 때 오류가 발생했습니다.

CronTrigger trigger = cronJobTriggerFactory.getObject(); 
trigger.setName(triggerName); 
trigger.setGroup(triggerGroupName); 
trigger.setCronExpression(cronSchedule); 
trigger.setVolatility(false); 

JobDetail job = schedulableJobFactory.getObject(); 
job.setName(jobName); 
job.setGroup(jobGroupName); 
job.setVolatility(false); 
job.setDurability(true); 
Date scheduleTime1 = scheduler.scheduleJob(job, trigger); 
logger.info(job.getKey() + " will run at: " + scheduleTime1); 

다음 내 단위 테스트에서 나는 "지금"날짜를 결정하고, 그것을 5 분 추가 : 여기

내가 트리거를 생성하고 그와 함께 작업을 예약하고 어떻게 이 날짜/시간 및 주 수업 시간에 전화하면이 일정으로 일할 수 있습니다.

org.quartz.SchedulerException: Based on configured schedule, the given trigger will never fire. 
: 나는 다음과 같은 오류를 받고 있어요 -이 크론 식으로 작업을 예약 할 때

NotificationSchedulerTest - Today is: 9 May 2012 05:32 PM 
NotificationSchedulerTest - 5 min later is: 9 May 2012 05:37 PM 
NotificationSchedulerTest - cron schedule is: 0 37 17 * 4 ? 2012 

그러나, 다음은 크론 표현이 전달됩니다 보여줍니다 단위 테스트의 넣어 밖으로이다

보시다시피 테스트를 실행하는 날짜/시간에 상대적인 미래의 날짜입니다. 따라서 과거 한 번에 작업이 실행되도록 예약하는 데는 문제가 없습니다.

다음으로 이상한 점은 : "0 37 17 * 4? "으로 연도 값을 지정했는지 확인하십시오.

cron 표현식 생성을 수정하고 연도 필드를 지정하지 않은 상태로두면 (선택 사항이므로) : "0 37 17 * 4?" 그런 다음 스케줄링이 성공하지만 스케줄러는 다음에 작업 할 때 2013 년임을 보여줍니다! (1 년 후 ... - 물론 나는 ...이 발사되어 있는지 확인하는 것이 그렇게 오래 기다릴 수 없어) :

NotificationSchedulerTest - Today is: 9 May 2012 06:11 PM 
NotificationSchedulerTest - 5 min later is: 9 May 2012 06:16 PM 
NotificationSchedulerTest - cron schedule is: 0 16 18 * 4 ? 
... 
NotificationScheduler - myJobKey will run at: Mon Apr 01 18:16:00 EDT 2013 

나는이 크론 표현식에서 뭔가를 놓치고 있습니까?

답변

4

cron 표현의 월 수는 1 기준입니다. 그렇기 때문에 0 37 17 * 4 ? 2012은 실행되지 않습니다. 오늘은 5 월 10 일이며, 4 월의 매일 실행하기를 원합니다. 연도를 삭제하면 2013 년에 다음 예정 날짜가 인쇄되지만 4 월에 인쇄됩니다! myJobKey는 다음에서 실행됩니다. 월 Apr 01 18:16:00 EDT 2013.

은 분명히 당신의 표현해야한다 :

0 37 17 * 5 ? 2012 

또는 미래에 혼란을 피하기 위해 :

0 37 17 * May ? 2012 
+0

감사합니다! 나는 그것이 어리 석다는 것을 알았다 ... 혼란은 내가 자바 캘린더 인스턴스에서 직접 cron 스케쥴을 생성하는 방식에서왔다. 'code'Calendar cal1 = Calendar.getInstance(); ... cronString.add (""+ String.valueOf (cal1.get (Calendar.MONTH)); 'code'그리고 Calendar에서 0부터 시작합니다! 이제 Quartz에 1을 더해야합니다. , 토마스! :) – Marina

+0

나는 똑같은 실수를 저질 렀다. 이 답변 덕분에 빨리 찾을 수있었습니다. – Nik

관련 문제