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

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

5 ответов

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

[DisallowConcurrentExecution]
public class MyJob : IJob
{
 ...
}

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

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

Если вы используете 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

Если вы используете интеграцию пружинного кварца, вы можете указать свойство '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>
Другие вопросы по тегам