Запланируйте триггер каждую минуту, если задание все еще выполняется, затем перейдите в режим ожидания и дождитесь следующего запуска - PullRequest
4 голосов
/ 25 мая 2009

Мне нужно запланировать срабатывание триггера каждую минуту, в следующую минуту, если задание все еще выполняется, триггер не должен срабатывать и должен подождать еще одну минуту, чтобы проверить, завершилось ли задание, срабатывает триггер. Спасибо

Ответы [ 5 ]

13 голосов
/ 14 сентября 2012

В Quartz 2 вы захотите использовать атрибут DisallowConcurrentExecution в своем классе работы. Затем убедитесь, что вы настроили ключ, используя что-то похожее на TriggerBuilder.Create().WithIdentity( "SomeTriggerKey" ), поскольку DisallowConcurrentExecution использует его, чтобы определить, выполняется ли уже ваше задание.

[DisallowConcurrentExecution]
public class MyJob : IJob
{
 ...
}
5 голосов
/ 26 мая 2009

Я не нашел ничего о monitor.enter или что-то в этом роде, спасибо, так или иначе другой ответ заключается в том, что задание должно реализовывать интерфейс StatefulJob. В качестве StatefulJob другой экземпляр не будет работать, пока он уже запущен еще раз спасибо

2 голосов
/ 01 июня 2009

IStatefulJob является ключом здесь. Создание собственных механизмов блокировки может вызвать проблемы с планировщиком, так как вы затем участвуете в потоке.

1 голос
/ 25 мая 2009

Если вы используете Quartz.NET, вы можете сделать что-то подобное в вашем методе Execute:

object execution_lock = new object();

public void Execute(JobExecutionContext context) {
    if (!Monitor.TryEnter(execution_lock, 1)) {
        return,
    }

    // do work

    Monitor.Exit(execution_lock);
}

Я вытаскиваю это из головы, возможно, некоторые имена неверны, но в этом-то и заключается идея: заблокировать какой-либо объект во время выполнения, и если после выполнения блокировка включена, то предыдущее задание все еще выполняется а ты просто return;

РЕДАКТИРОВАТЬ: класс Monitor находится в пространстве имен System.Threading

0 голосов
/ 12 мая 2014

Если вы используете интеграцию пружинного кварца, вы можете указать для свойства 'concurrent' значение 'false' из MethodInvokingJobDetailFactoryBean

 <bean id="positionFeedFileProcessorJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="xxxx" />
        <property name="targetMethod" value="xxxx" />
        <property name="concurrent" value="false" /> <!-- This will not run the job if the previous method is not yet finished -->
    </bean>
...