2016-07-11 14 views
0

Wir haben eine Serviceklasse, die für die Planung von Aufträgen basierend auf Benutzereingaben verantwortlich ist. Eine der Methoden dieser Klasse akzeptiert Objekte mit Benutzereingaben und erstellt einen Cron-Ausdruck dafür. begann ich Unit-Tests für jeden Anwendungsfall und kam zwischen zwei fast identischen Tests über absolut unerklärliche Diskrepanz zu erstellen:Absolut unerklärliche Ergebnisse für Cron-basierte Scheduler in Quartz

Ein testen den Fall Job wiederkehrender alle 2 Tage:

"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 
    } 
    } 

Und es funktioniert jedes Mal ohne Probleme.

Und ein anderer, testet die gleiche Sache von 4 Tagen Intervall:

"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 
    } 

Last one verwendet paar Tagen zu arbeiten, und dann fing ich an, ohne wirklich etwas zu ändern, die gleichen Fehler zu erhalten.

'Mi 13 Jul 2016 UTC 05.57.00' nicht gleich zu 'Mo 11 Jul 2016 UTC 05.57.00 '

Dieser Fehler bedeutet, dass das nächste berechnete Datum ist nicht das erste Laufdatum, aber das eine nach. Warum passiert es? Was vermisse ich?

Antwort

2

Sie scheinen verwirrt darüber zu sein, wie 1/4 in einem Cron-Ausdruck interpretiert wird. Im Tag-of-month-Feld werden die Tage 1, 5, 9, 13 usw. übereinstimmen. Also, wenn "jetzt" der 11. Juli ist, ist das nächste Spiel der 13. Juli.

+0

Also, tut es bedeutet, dass ich auch das Startdatum für diesen Ausdruck herausfinden muss, damit es richtig funktioniert? –

+1

Es hängt wirklich davon ab, was Sie versuchen zu tun. Wenn Sie einen Zeitplan alle n Tage wünschen, wäre ein 'CalendarInterval' (siehe' CalendarIntervalScheduleBuilder.withIntervalInDays') besser als ein 'CronExpression'. –