ผลลัพธ์ที่ไม่สามารถอธิบายได้อย่างแน่นอนสำหรับตัวกำหนดเวลาที่ใช้ 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 ก.ค. 05:57:00 UTC 2016' ไม่เท่ากับ 'จันทร์ที่ 11 ก.ค. 05:57:00 UTC 2016'

ข้อผิดพลาดนี้หมายความว่าวันที่คำนวณครั้งถัดไปไม่ใช่วันที่ดำเนินการครั้งแรก แต่เป็นวันที่หลังจากนั้น ทำไมมันถึงเกิดขึ้น? ฉันคิดถึงอะไร?


person Shurik Agulyansky    schedule 11.07.2016    source แหล่งที่มา


คำตอบ (1)


ดูเหมือนคุณจะสับสนเกี่ยวกับการตีความ 1/4 ในนิพจน์ cron ในช่องวันของเดือนจะตรงกับวันที่ 1, 5, 9, 13 เป็นต้น ใช่แล้ว หาก "ตอนนี้" คือวันที่ 11 กรกฎาคม นัดถัดไปจะเป็นวันที่ 13 กรกฎาคม

person Joe Pallas    schedule 11.07.2016
comment
หมายความว่าฉันจะต้องทราบวันที่เริ่มต้นสำหรับนิพจน์นั้นด้วยเพื่อให้ทำงานได้อย่างถูกต้องใช่หรือไม่ - person Shurik Agulyansky; 11.07.2016
comment
มันขึ้นอยู่กับสิ่งที่คุณพยายามทำจริงๆ หากคุณต้องการกำหนดการที่ทุกๆ n วัน รูปแบบที่เหมาะสมที่สุดคือ CalendarInterval (ดู CalendarIntervalScheduleBuilder.withIntervalInDays) มากกว่า CronExpression - person Joe Pallas; 12.07.2016