Как пропустить выполнение определенной работы в Spring Quartz Scheduler - PullRequest
1 голос
/ 20 февраля 2012

У меня установлено CronExpression для выполнения задания каждые 30 минут. Но мне нужно пропустить конкретную работу, если предыдущая работа не завершена.

Например, У меня есть 100 сотрудников, чьи имена должны быть обновлены в базе данных, и я называю это «Job1», который начинается в 10:00. Теперь дело похоже на «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 ]

3 голосов
/ 20 февраля 2012

Одним из способов является реализация интерфейса 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 голос
/ 20 февраля 2012

Если это один и тот же класс задания: @ DisallowConcurrentExecution

Иначе это звучит так, как будто вам нужно использовать одного исполнителя пула потоков. Внедрите одного и того же исполнителя в оба класса (или альтернативно реализуйте класс Orchestrator для управления этим) и добавьте рабочие блоки в очередь таким образом.

0 голосов
/ 14 октября 2014

Если вам никогда не понадобится запускать несколько заданий параллельно, вы можете установить пул рабочих потоков, который использует Quartz, равным 1. Тогда он будет запускать только одно задание за раз.В вашем файле quartz.properties установите:

org.quartz.threadPool.threadCount: 1
...