Запланируйте триггер каждую минуту, если задание все еще выполняется, то в режиме ожидания и дождитесь следующего запуска
Мне нужно запланировать срабатывание триггера каждую минуту, в следующую минуту, если задание все еще выполняется, триггер не должен срабатывать и должен подождать еще одну минуту, чтобы проверить, завершилось ли задание, срабатывает триггер. Спасибо
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>