우리는 사용자 입력에 따라 작업 스케줄링을 담당하는 서비스 클래스를 가지고 있습니다. 그 클래스의 메소드 중 하나는 사용자 입력을 가진 객체를 받아들이고 그것을위한 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'이 오류는 다음 날짜 계산을 의미
첫 번째 실행 날짜가 아니라 후속 실행 날짜입니다. 왜 그런가? 나는 무엇을 놓치나요?
그래서 그 표현식의 시작 날짜를 알아 내야 제대로 작동 할 수 있습니다. –
그것은 정말로 당신이하려고하는 것에 달려 있습니다. 매 n 일간의 스케줄을 원한다면, CronExpression보다'CalendarInterval' (CalendarIntervalScheduleBuilder.withIntervalInDays' 참조)이 더 적합 할 것입니다. –