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

4 quartz-scheduler quartz.net

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

Ian*_*vis 13

在Quartz 2中,您将需要DisallowConcurrentExecution在作业类中使用该属性.然后确保你使用类似的东西设置了一键TriggerBuilder.Create().WithIdentity( "SomeTriggerKey" )DisallowConcurrentExecution使用它来确定,如果你的工作已经在运行.

[DisallowConcurrentExecution]
public class MyJob : IJob
{
 ...
}
Run Code Online (Sandbox Code Playgroud)


小智 5

我没有找到关于monitor.enter或类似的东西,感谢任何方式,另一个答案是该作业应该实现'StatefulJob'接口.作为StatefulJob,只要有一个实例再次运行,另一个实例将无法运行


Don*_*ter 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);
}
Run Code Online (Sandbox Code Playgroud)

我把这个从我的脑海中拉出来,也许有些名称是错误的,但这就是想法:在执行时锁定某个对象,如果在执行时锁定处于打开状态,则先前的作业仍在运行,您只需return;

编辑:Monitor 类位于 System.Threading 命名空间中