如何在Spring Quartz Scheduler中跳过特定的作业执行

时间:2012-02-20 18:32:16

标签: java spring jobs quartz-scheduler

我为每30分钟执行的作业设置了一个CronExpression。但如果早先的工作没有完成,我需要跳过一项特定的工作。

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

    <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>

3 个答案:

答案 0 :(得分:3)

一种方法是实现TriggerListener接口,该接口提供vetoJobExecution(Trigger trigger, JobExecutionContext context)方法来否决下一个作业的执行。从此方法返回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();

答案 1 :(得分:1)

如果他们是同一个工作班:@DisallowConcurrentExecution

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

答案 2 :(得分:0)

如果您永远不需要并行运行多个作业,您可以将Quartz使用的工作线程池设置为1.然后它将一次只运行一个作业。在quartz.properties文件中,设置:

org.quartz.threadPool.threadCount: 1