2016-07-11 4 views
0

우리는 사용자 입력에 따라 작업 스케줄링을 담당하는 서비스 클래스를 가지고 있습니다. 그 클래스의 메소드 중 하나는 사용자 입력을 가진 객체를 받아들이고 그것을위한 cron 표현식을 만든다. 나는 각 단위 테스트 및 모든 사용 사례를 만드는 시작이 개 거의 동일 시험 사이에 절대적으로 설명 할 수없는 차이가 건너 온 :Quartz 기반의 cron 기반 스케줄러에 대한 설명 할 수없는 결과

하나는 2 일마다 작업을 반복하는 경우를 테스트 :

"ChecklistCreationScheduler#buildCronExpression" should { 
    "build correct cron expressions for day interval of 2" in { 
     val jobScheduler = mock[JobScheduler] 
     val futureChecklistRepository = mock[FutureChecklistRepository] 

     val chlCreationScheduler = new ChecklistCreationScheduler(jobScheduler, futureChecklistRepository) 

     val now = DateTime.now.withSecondOfMinute(0).withMillisOfSecond(0) 

     val dayIntervalForm = mock[CreateJobForm] 
     dayIntervalForm.maybeDayInterval returns Some(2) 

     val cronStr = chlCreationScheduler.buildCronExpression(List(dayIntervalForm), now) 
     cronStr must_== "0 %s %s 1/2 * ? *".format(now.getMinuteOfHour, now.getHourOfDay) 

     val cronExpression = new CronExpression(cronStr) 
     val firstRun = cronExpression.getNextValidTimeAfter(now.minusMinutes(1).toDate) 
     firstRun must_== now.toDate 
     cronExpression.getNextValidTimeAfter(firstRun) must_== now.plusDays(2).toDate 
    } 
    } 

그리고 매번 문제없이 작동합니다.

그리고 다른 하나는 4 일 간격으로 같은 일을 테스트합니다

"build correct cron expressions for day interval of 4" in { 
     val jobScheduler = mock[JobScheduler] 
     val futureChecklistRepository = mock[FutureChecklistRepository] 

     val chlCreationScheduler = new ChecklistCreationScheduler(jobScheduler, futureChecklistRepository) 

     val now = DateTime.now.withSecondOfMinute(0).withMillisOfSecond(0) 

     val dayIntervalForm = mock[CreateJobForm] 
     dayIntervalForm.maybeDayInterval returns Some(4) 

     val cronStr = chlCreationScheduler.buildCronExpression(List(dayIntervalForm), now) 
     cronStr must_== "0 %s %s 1/4 * ? *".format(now.getMinuteOfHour, now.getHourOfDay) 

     val cronExpression = new CronExpression(cronStr) 
     val firstRun = cronExpression.getNextValidTimeAfter(now.minusMinutes(1).toDate) 
     firstRun must_== now.toDate 
     cronExpression.getNextValidTimeAfter(firstRun) must_== now.plusDays(4).toDate 
    } 

마지막 하나는 전에 며칠을 작업하는 데 사용하고 난 정말 아무 것도 변경하지 않고 동일한 오류가 발생하기 시작했다.

'물 월 13 5시 57분 0초 UTC 2016'는 동일하지 않은 행 '11 월 7 월를 5시 57분 0초 UTC 2016'이 오류는 다음 날짜 계산을 의미

첫 번째 실행 날짜가 아니라 후속 실행 날짜입니다. 왜 그런가? 나는 무엇을 놓치나요?

답변

2

1/4이 cron 식으로 해석되는 방법에 대해 혼란스러워합니다. day-of-month 필드에서는 1, 5, 9, 13 일과 일치합니다. 예, "지금"이 7 월 11 일이면 다음 경기가 7 월 13 일이됩니다.

+0

그래서 그 표현식의 시작 날짜를 알아 내야 제대로 작동 할 수 있습니다. –

+1

그것은 정말로 당신이하려고하는 것에 달려 있습니다. 매 n 일간의 스케줄을 원한다면, CronExpression보다'CalendarInterval' (CalendarIntervalScheduleBuilder.withIntervalInDays' 참조)이 더 적합 할 것입니다. –

관련 문제