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