2012-02-20 43 views
1

跳过一个特定的作业执行我有一个CronExpression作业设置为每30分钟要执行。但是如果以前的工作不完整,我需要跳过一项特定的工作。如何在Spring Quartz调度

例如,我有100名员工的姓名要在数据库中更新,我称之为“Job1”,上午10点开始。现在情况就像“Job1”正在处理中,当我有另一份工作 - “Job2”对齐时,我需要更新另外50名员工的姓名。我的问题是,我需要跳过“Job2”和其他工作,直到我当前正在运行的Job完成。

<bean name="employeeNameUpdateJob" class="org.springframework.scheduling.quartz.JobDetailBean"> 
     <property name="name" value="Employee Update Job"/> 
     <property name="group" value="Employee Update Group Job"/> 
     <property name="jobClass" 
      value="com.emp.scheduler.EmployeeUpdateScheduler" /> 
     <property name="volatility" value="false" /> 
    </bean> 

<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> 
     <property name="name" value="Employee Update Trigger"/> 
     <property name="group" value="Employee Update Group Trigger"/> 
     <property name="volatility" value="false" /> 
     <property name="jobDetail" ref="employeeNameUpdateJob"/> 
     <property name="cronExpression" value="0 0/30 * * * ?"/> 
    </bean> 

回答

1

如果它们是同一个作业类:@DisallowConcurrentExecution

否则这听起来像你需要使用一个线程池执行。将相同的执行程序注入到这两个类中(或者实现一个orchestrator类来管理它),然后将这些工作单元以这种方式添加到队列中。

3

一种方法是实现TriggerListener接口,该接口提供了一个方法来否决下一个作业的执行。从此方法返回true将停止作业的执行。

接口文档:http://quartz-scheduler.org/api/2.0.0/org/quartz/TriggerListener.html#vetoJobExecution(org.quartz.Trigger,org.quartz.JobExecutionContext)

样品:

//SampleTriggerListener.java 
public class SampleTriggerListener implements TriggerListener { 

    @Override 
    public boolean vetoJobExecution(Trigger trigger, JobExecutionContext ctx) { 
     if(!previousJobCompleted) 
      return true; 

     return false; 
    } 
} 


//Main.java 
//init jobs, trigger & scheduler 
this.scheduler.addTriggerListener(new SampleTriggerListener()); 
this.scheduler.start(); 
0

如果你将永远需要运行多个作业并行,你可以设置Quartz使用的工作线程池那么它一次只能运行一项工作。在你的quartz.properties文件,设置:

org.quartz.threadPool.threadCount: 1