我想要实现的目标: 我有一个第二个触发器,每5秒触发一次,有状态的工作,有时超过5秒(例如7)和我现在拥有的
start: 00:00:00
end : 00:00:07
start: 00:00:07 < right after previous has finished
我想要的是什么:
start: 00:00:00
it should run at 00:00:05 but it hasn't
end : 00:00:07
start: 00:00:10 (5 seconds after previous, successive or not)
我已经尝试过quartz.net版本2和1。
作业:
[PersistJobDataAfterExecution]
[DisallowConcurrentExecution]
public class StatefulJob : IJob (or IStatefulJob in 1.x version)
{
public void Execute(IJobExecutionContext context)
{
Console.WriteLine("StateFull START " + DateTime.Now.ToString());
Thread.Sleep(7000);
Console.WriteLine("StateFull END " + DateTime.Now.ToString());
}
}
触发器:
var trigger1 = TriggerBuilder
.Create()
.WithSimpleSchedule(x =>
x.WithIntervalInSeconds(timeout)
.RepeatForever()
.Build();
修改
我曾尝试使用WithMisfireHandlingInstructionIgnoreMisfires()
,但由于调度程序被关闭或者因为没有可用的线程而发生了失误,在我的情况下 - 由于我使用StatefulJob,作业无法执行。也许我错了,但行为保持不变。
EDIT2 好的,带有'running'标志的解决方案在单线程应用程序中运行良好。但是,如果我在几个线程(使用不同的参数)中运行这个工作,它将无法工作 那么,是否有可能实现我想要使用石英的行为?
答案 0 :(得分:4)
如果你让你的工作同时运行,但是如果工作已经在运行,则将其修改为什么都没有,例如。
public class StatefulJob : IJob
{
private static bool Running;
public void Execute(IJobExecutionContext context)
{
if (Running)
return;
Running = true;
try
{
Console.WriteLine(" StateFull START " + DateTime.Now.ToString());
Thread.Sleep(7000);
Console.WriteLine(" StateFull END " + DateTime.Now.ToString());
}
finally
{
Running = false;
}
}
}