2012-10-18 42 views
1

使用石英,我想几个工作(约10)作为一个链执行 - 即不同时。 他们应该在“会计日更改”事件发生后执行,但由于他们都访问相同的数据库,我不希望他们一起开始。我希望他们顺序执行(顺序无关紧要)。石英作业 - 不允许并发执行组?

我有一个想法把它们放到一个组中 - 比如说“account_day_change_jobs”并配置Quartz以某种方式为我完成剩下的工作:-)手段 - 依次运行组中的所有工作。我尝试了API文档(包括1.8和2.1),试图谷歌,但没有发现任何东西。

可能吗?这是否合理?其他想法如何实现我想要的行为?

非常感谢:-) 汉斯任何想法

回答

0

其一直以来我用石英很长一段时间,但我会设法在历时job listeners注册听两个不同的组

的基本思路应该从一个组/列表(“todayGroup”)开始一个工作,'(“todayGroup”)作业监听器检测完成的好坏。然后开始列表中的下一项工作。但是,它将“刚完成”作业保存在(“tomorrowGroup”)下的调度程序中。

public class MyTodayGroupListener extends JobListenerSupport { 

    private String name; 

    private static String GROUP_NAME = "todayGroup"; 

    public MyOtherJobListener(String name) { 
    this.name = name; 
    } 

    public String getName() { 
    return name; 
    } 


    @Override 
    public void jobWasExecuted(JobExecutionContext context, 
     JobExecutionException jobException) { 
     Scheduler sched = context.getScheduler(); 
     // switch the job to the other group so we don't run it again today. 
     JobDetail current = context.getJobDetail(); 
     JobDetail tomorrows = current.getJobBuilder().withIdentity(current.getKey().getName(), "tomorrow").build(); 
     sched.addJob(tomorrows,true); 

     //see if there is anything left to run 
     Set<JobKey> jobKeys = sched.getJobKeys(groupEquals(GROUP_NAME)); 
     Iterator<JobKey> nextJob = null; 
     if(jobKeys != null && !jobKeys.isEmpty()){ 
      nextJob = jobKeys.iterator(); 
     } 
     if(nextJob != null){ 
      // Define a Trigger that will fire "now" and associate it with the first job from the list 
      Trigger trigger = newTrigger() 
       .withIdentity("trigger1", "group1") 
       .startNow() 
       .forJob(nextJob =.next()) 
       .build(); 

      // Schedule the trigger 
      sched.scheduleJob(trigger); 
     } 

    } 
} 

同样,你需要两个“组触发”,将在您需要的特定时间火从各自小组的第一份工作。

0

下面的Trigger Listener类应该重新计划任何尝试执行的作业,而侦听器已配置的另一个作业正在运行。我只是轻度测试它,但对于简单的情况它应该是合适的。

public class SequentialTriggerListener extends TriggerListenerSupport { 

private JobKey activeJob; 
private Scheduler activeScheduler; 
private Queue<JobDetail> queuedJobs = new ConcurrentLinkedQueue<JobDetail>(); 

public String getName() { 
    return "SequentialTriggerListener"; 
} 

public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) { 
    synchronized (this) { 
     if (activeJob != null) { 
      getLog().debug("Queueing Sequential Job - " + context.getJobDetail().getKey().getName()); 
      JobDetail jd = context.getJobDetail(); 
      activeScheduler = context.getScheduler(); 
      jd = JobBuilder.newJob().usingJobData(jd.getJobDataMap()).withIdentity(getName() + ":" + jd.getKey().getName(), jd.getKey().getGroup()) 
        .ofType(jd.getJobClass()).build(); 
      queuedJobs.add(jd); 
      return true; 
     } else { 
      activeJob = trigger.getJobKey(); 
      getLog().debug("Executing Job - " + activeJob.getName()); 
      return false; 
     } 
    } 
} 

public void triggerMisfired(Trigger trigger) { 
    triggerFinalized(trigger); 
} 

public void triggerComplete(Trigger trigger, JobExecutionContext context, CompletedExecutionInstruction triggerInstructionCode) { 
    triggerFinalized(trigger); 
} 

protected void triggerFinalized(Trigger trigger) { 
    synchronized (this) { 
     try { 
      if (trigger.getJobKey().equals(activeJob)) { 
       getLog().debug("Finalized Sequential Job - " + activeJob.getName()); 
       activeJob = null; 
       JobDetail jd = queuedJobs.poll(); 
       if (jd != null) { 
        getLog().debug("Triggering Sequential Job - " + jd.getKey().getName()); 
        activeScheduler.scheduleJob(jd,TriggerBuilder.newTrigger().forJob(jd).withIdentity("trigger:" + jd.getKey().getName(), jd.getKey().getGroup()) 
          .startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withRepeatCount(0).withIntervalInMilliseconds(1)).build()); 
       } 
      } else { 
       // this should not occur as the trigger finalizing should be the one we are tracking. 
       getLog().warn("Sequential Trigger Listener execution order failer"); 
      } 
     } catch (SchedulerException ex) { 
      getLog().warn("Sequential Trigger Listener failure", ex); 
     } 
    } 

} 

}