Google Prettify

2008-01-22

如何在Quartz中確定當上一個job尚未執行完前不執行下一次job?

為了避免重覆執行企業邏輯,我們在排程時有時必須確保上一次的工作執行完後,才可以允許下一個排程工作繼續執行。也就是說,原則上是個一個固定時間區間執行一次企業邏輯運算,但實際上必須等到上一次運算完後,才可以繼續執行下一次的運算...當然,也是要在固定時間區間之後。以下是個人撰寫的部份sample code。主要是利用Scheduler.getCurrentlyExecutingJobs()來限制執行job的數量。其實原理並不是不執行排程,只是不執行排程裡設定的動作。

Sample code後有一段是展示如何重新啟動排程及設定排程時間。

這段Sample code是使用Spring framework。

public class LogAnalysisJob extends QuartzJobBean {
    private LogAnalysisBO bo;

    public void setBo(MyBO bo) {
        this.bo = bo;
    }

    protected void executeInternal(JobExecutionContext c)
    throws JobExecutionException {
    Scheduler sc = c.getScheduler();
    try {
      List l = sc.getCurrentlyExecutingJobs();
      if (l.size() <= 1) { //限定目前的只有1個bo被執行
      bo.exe();//真正執行企業邏輯的部份
    }
    SimpleTriggerBean t = (SimpleTriggerBean) c.getTrigger();
    if (count > 10) {
       t.setRepeatInterval(t.getRepeatInterval() + 3000);//如果排程執行超過10次, 每次執行間隔就延長3秒
       sc.rescheduleJob(t.getName(), c.getJobDetail().getGroup(), t);
       count = 0;
    }
    count++;
  } catch (SchedulerException e) {
    e.printStackTrace();
  }

    private static int count;
}

沒有留言 :

您或許對這些有興趣

Related Posts with Thumbnails

最後

謝謝您的閱讀,希望您可以有豐富的收獲。