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

时间:2012-11-08 21:56:36

标签: java scheduled-tasks scheduling quartz-scheduler

关于Quartz的几个单独的问题

  1. 如果我想要执行一次事件,那么

    就足够了
    trigger.setRepeatCount(0);
    
  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);
    
  3. 使用上面的代码,我会观察以下内容

    Time now         : 1352410780356
    Will execute at  : 1352410840356  // 1 min interval
    Execution starts : 1352410840368
    

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

    好的..尝试更大的间隔

    Time now         : 1352411061156
    Will execute at  : 1352411301156 // 3 min interval
    Execution starts : 1352411301165
    

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

    应该及时执行

       new MomentInTime(new DayOfMonth(8), new HourOfDay(15), new MinuteOfHour(48));
    

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

    如果它是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();
    }
    

1 个答案:

答案 0 :(得分:2)

1行修复

    calendarInstance.set(Calendar.MILLISECOND, 0);

完成。