如果作业仍在运行,则等待下一次触发,每分钟计划一次触发

时间:2009-05-25 13:25:51

标签: quartz-scheduler quartz.net

我需要安排一个触发器来触发每一分钟,下一分钟如果作业仍然在运行,触发器不应该触发并且应该等待另一分钟来检查,如果作业已经完成触发器应该触发 感谢

5 个答案:

答案 0 :(得分:13)

在Quartz 2中,您需要在作业类中使用DisallowConcurrentExecution属性。然后确保使用与TriggerBuilder.Create().WithIdentity( "SomeTriggerKey" )类似的内容设置密钥,DisallowConcurrentExecution使用它来确定您的作业是否已在运行。

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

答案 1 :(得分:5)

我没有找到关于monitor.enter或类似的东西的任何事情,谢谢你 另一个答案是该作业应该实现'StatefulJob'接口。作为StatefulJob,只要一个实例已经在运行,它就不会运行 再次感谢

答案 2 :(得分:2)

IStatefulJob是关键所在。创建自己的锁定机制可能会导致调度程序出现问题,因为您正在参与线程。

答案 3 :(得分:1)

如果你正在使用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命名空间

答案 4 :(得分:0)

如果您使用的是spring quartz integration,则可以从MethodInvokingJobDetailFactoryBean中将'concurrent'属性指定为'false'

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