在石英调度程序上,需要澄清

Jam*_*sev 5 java scheduling scheduled-tasks quartz-scheduler

几个关于Quartz的单独问题

  1. 如果我想要一次执行事件,那就足够了

    trigger.setRepeatCount(0);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 考虑这个片段.当预定时间"在此之前"时,事件运行,并且在预定时间在将来时无法执行

    JobDetail job = new JobDetail();
    job.setName(eventType.toString() + " event");
    job.setJobClass(Action.class);
    
    SimpleTrigger trigger = new SimpleTrigger();
    trigger.setStartTime(new Date(momentInTime.inMillis()));
    trigger.setName("trigger");
    
    trigger.setRepeatInterval(repeatFrequency.inMillis());
    trigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
    
    scheduleManager.getScheduler().scheduleJob(job, trigger);
    
    Run Code Online (Sandbox Code Playgroud)

使用上面的代码,我观察以下内容

Time now         : 1352410780356
Will execute at  : 1352410840356  // 1 min interval
Execution starts : 1352410840368
Run Code Online (Sandbox Code Playgroud)

现在和计划执行的时间之间的差异恰好是1分钟..

好的..尝试更大的间隔

Time now         : 1352411061156
Will execute at  : 1352411301156 // 3 min interval
Execution starts : 1352411301165
Run Code Online (Sandbox Code Playgroud)

再次..差异正好是3分钟,如

执行应该在某个时刻

   new MomentInTime(new DayOfMonth(8), new HourOfDay(15), new MinuteOfHour(48));
Run Code Online (Sandbox Code Playgroud)

它实际上开始(似乎开始,我应该说)作为当前时间和请求时间之间的偏移(甚至是偏移).

看起来,如果它10:43:25和我想要一份工作开始10:45:00,它会发现有两个甚至几分钟的差异,并安排工作10:45:25.

是什么导致了这个?

与此同时,

public MomentInTime(DayOfMonth day, HourOfDay hour, MinuteOfHour min) {
    calendarInstance = Calendar.getInstance();

    // Get current year and month
    int year = calendarInstance.get(Calendar.YEAR);
    int month = calendarInstance.get(Calendar.MONTH);

    calendarInstance.set(year, month, day.getValue(), hour.getValue(), min.getValue());
    System.out.println("Time now       : " + System.currentTimeMillis());
    System.out.println("Will execute at: " + calendarInstance.getTimeInMillis());
}

public long inMillis() {
    return calendarInstance.getTimeInMillis();
}
Run Code Online (Sandbox Code Playgroud)

Jam*_*sev 2

1 行修复

    calendarInstance.set(Calendar.MILLISECOND, 0);
Run Code Online (Sandbox Code Playgroud)

完毕。