【发布时间】:2015-04-23 08:12:51
【问题描述】:
我使用的是quartz.net 2.3 作业标有 DisallowConcurrentExecution 属性。当由 TriggerJob 手动启动作业时,如果它已经在进行中,它不会启动,没关系。但是当上一次执行完成时,它会立即再次启动。 如果在作业进行时被触发,是否可以防止将来执行?
【问题讨论】:
标签: quartz.net
我使用的是quartz.net 2.3 作业标有 DisallowConcurrentExecution 属性。当由 TriggerJob 手动启动作业时,如果它已经在进行中,它不会启动,没关系。但是当上一次执行完成时,它会立即再次启动。 如果在作业进行时被触发,是否可以防止将来执行?
【问题讨论】:
标签: quartz.net
是的。您可以检索作业的所有触发器,将它们与正在执行的触发器进行比较,如果它们是在它之后安排的,则取消安排作业(触发器将被删除)。
所以,从你的工作来看:
public void Execute(IJobExecutionContext context)
{
var currentlyExecutingTrigger = context.Trigger;
var currentlyExecutingJobkey = context.JobDetail.Key;
var newTriggers = context.Scheduler.GetTriggersOfJob(key);
//if trigger was scheduled after currently executing trigger
foreach (var newTrigger in newTriggers)
{
if (newTrigger.StartTimeUtc >= trigger.StartTimeUtc)
{
//delete it
context.Scheduler.UnscheduleJob(newTrigger.Key);
}
}
}
【讨论】:
如何防止作业同时触发?
Quartz.NET 2.x
实现 IJob 并使用 [DisallowConcurrentExecution] 属性装饰您的作业类。阅读 DisallowConcurrentExecutionAttribute 的 API 文档了解更多信息。
您可以在文档中找到它 enter link description here
【讨论】:
我想你正在寻找这个:
myJobTrigger.MisfireInstruction = MisfireInstruction.CronTrigger.DoNothing;
我没有尝试过,但似乎它与 DisallowConcurrentExecution 属性配合得很好
【讨论】: