Scala 石英中基于cron的调度器的绝对无法解释的结果

Scala 石英中基于cron的调度器的绝对无法解释的结果,scala,cron,quartz-scheduler,scheduling,Scala,Cron,Quartz Scheduler,Scheduling,我们有一个服务类,负责根据用户输入安排作业。该类的一个方法接受带有用户输入的对象,并为其构建cron表达式。 我开始为每个用例创建单元测试,并在两个几乎相同的测试之间遇到了无法解释的差异: 每2天测试一次重复作业: "ChecklistCreationScheduler#buildCronExpression" should { "build correct cron expressions for day interval of 2" in { val jobSchedul

我们有一个服务类,负责根据用户输入安排作业。该类的一个方法接受带有用户输入的对象,并为其构建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
    }
上一个在几天前就开始工作了,然后我开始出现同样的错误,但没有真正改变任何事情

“2016年7月13日星期三05:57:00 UTC”不等于“7月11日星期一05:57:00 UTC” UTC 2016'


此错误意味着下一个计算日期不是第一个运行日期,而是之后的日期。为什么会这样?我错过了什么?

您似乎对在cron表达式中如何解释1/4感到困惑。在月日字段中,它将匹配第1天、第5天、第9天、第13天等。因此,是的,如果“现在”是7月11日,那么下一个匹配将是7月13日。

您似乎对1/4在cron表达式中的解释感到困惑。在月日字段中,它将匹配第1天、第5天、第9天、第13天等。因此,是的,如果“现在”是7月11日,则下一个匹配将是7月13日。

那么,这是否意味着我也需要计算该表达式的开始日期,以便它正常工作?这确实取决于您正在尝试执行的操作。如果您想要一个每n天一次的日程安排,最好是
CalendarInterval
(请参阅
CalendarIntervalsScheduleBuilder.withIntervalInDays
)而不是
CronExpression
。那么,这是否意味着我也需要计算该表达式的开始日期,为了让它正常工作?这真的取决于你想做什么。如果您想要一个每n天一次的日程安排,最好使用
日历间隔
(请参阅
CalendarIntervalsScheduleBuilder.withIntervalInDays
)而不是
CronExpression