2013-11-01 35 views
2

我是Quartz的新手,一直停留在重複的作業上。 它們是由兩個觸發時間重疊的觸發器引起的。石英:跳過火災時間相同的重複作業火災

是否有石英「亂用」的功能,這將防止同樣的工作,重複的火災有多個連接觸發器?

或者,也許有一些第三方Trigger實施,允許結合的時間表與合適的發射時間的計算,這將防止重複明火時代?

或者我可以以某種方式組合多個時間表?

任何解決方案將不勝感激。

感謝

對於清晰度:

public static class MyJob implements Job { 
    @Override 
    public void execute(JobExecutionContext context) throws JobExecutionException { 
     System.out.println("My Job at " + DateUtils.toDateTimeString(context.getFireTime()) + " by " + 
       context.getTrigger().getKey().getName()); 
    } 
} 

startScheduler() { 

    final Set<Trigger> triggers = new HashSet<Trigger>(); 
    triggers.add(TriggerBuilder.<CronScheduleBuilder>newTrigger().withIdentity("every 3 secs"). 
      withSchedule(CronScheduleBuilder.cronSchedule("0/3 * * * * ? *")).build()); 
    triggers.add(TriggerBuilder.<CronScheduleBuilder>newTrigger().withIdentity("every 2 secs"). 
      withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ? *")).build()); 

    final Scheduler scheduler = new StdSchedulerFactory(properties).getScheduler(); 
    scheduler.scheduleJob(JobBuilder.newJob(MyJob.class).build(), triggers, false); 
    scheduler.start(); 

} 

,並將日誌:

  • 我的工作在01.11.2013T23:19:26.000每2秒
  • 我的工作在01.11.2013T23:19:27.000由每3秒
  • 我的工作在01.11.2013T23:19:28.000每2 SE CS
  • 我在01.11.2013T23工作:19:30.000通過每2秒
  • 我的工作在01.11.2013T23:19:30.001通過每3秒
  • 我的工作在01.11.2013T23:19:32.000每2秒
  • 我的工作在01.11.2013T23:19:33.000每3秒
  • 我的工作在01.11.2013T 23:19:34.000每2秒
  • 我在01.11.2013T23工作:19:36.000通過每2秒
  • 我在01.11.2013T23工作:19:36.001通過每3秒
  • 我在01.11.2013T23工作:19:38.000每2秒
  • 我的工作在01.11.2013T23:19:39.000由每3秒
  • 我在01.11.2013T23工作:19:40.000每2秒
  • 我在01.11.2013T23工作:19:42.001通過每2秒
  • 我的工作在01.11.2013T23: 19:42。002通過每3秒

回答

3

研究發現,TriggerListener的適合這個任務:

scheduler.getListenerManager().addTriggerListener(new TriggerListener() { 

    private Date lastFireTime = null; 

    @Override 
    public String getName() { 
     return "prevent-duplicate-fires"; 
    } 

    @Override 
    public void triggerFired(Trigger trigger, JobExecutionContext context) { 
    } 

    @Override 
    public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) { 
     final Date fireTime = context.getScheduledFireTime(); 
     if (lastFireTime != null && fireTime.equals(lastFireTime)) { 
      return true; 
     } 
     lastFireTime = fireTime; 
     return false; 
    } 

    @Override 
    public void triggerMisfired(Trigger trigger) { 
    } 

    @Override 
    public void triggerComplete(Trigger trigger, JobExecutionContext context, Trigger.CompletedExecutionInstruction triggerInstructionCode) { 
    } 
}); 

看起來像它的工作原理:

  • 我的工作在01.11.2013T23:每2秒46:14.000
  • 我的工作在01.11.2013T23:46:15.000每3秒
  • 我在01.11.2013T23工作:46:16.000每2秒
  • 我的工作在01.11.2013T23:46:18.000每2秒
  • --->應該火,但跳過 - 在01.11我的工作.2013T23:46:18.000由每3秒
  • 我在01.11.2013T23工作:46:20.000由每2秒
  • 我的工作在01.11.2013T23:46:21.000由每3秒
  • 我的工作在01.11.2013T23:46:22.000每2秒
  • 我的工作在01.11.2013T23:46:24.000每2秒
  • --->應該火,但略過 - 我在01.11.2013T23工作:46:24.000由每3秒
  • 我的工作在01.11.2013T23:46:26.000每2秒
  • 我的工作在01.11。每3秒2013T23:46:27.000
0

這是停止運行作業的有用答案。除了安全防範從不調用重複作業之外,還可以在實現作業的類上使用註釋@DisallowConcurrentExecution。