我有一个服务,每隔X分钟运行一次。如果由于某些不可预见的原因,该作业需要超过X分钟,我希望确保触发器不会启动此作业的第二个实例。
示例场景
- 我有Job X,每1分钟从Quartz中获取文件并触发。
- Job X通常可在1分钟内处理100个文件,超过100个文件将需要更长时间。
- 自上次运行以来,有150个文件存在,因此Job X开始处理这些文件。当到达1分钟时,已处理100个文件,还剩下50个文件,并且Job X继续运行。
- 然而,由于触发器每1分钟触发一次,第二个Job X实例被启动。
- 现在有2个Job X实例正在获取相同的50个文件。
是否有一种方法可以将Quartz.NET连接到仅允许1个作业实例? 我可以让第二个触发器等待第一个完成或者我也可以让它跳过第二个触发器,因为它将在一分钟后再次触发。
我查看了Quartz API的Java版本,并找到了一个名为'DisallowConcurrentExecution'的属性,但在.NET版本中没有找到类似的属性。
我的Quartz.NET实现代码
public IScheduler Scheduler { get; set; }
public IJobListener AutofacJobListener { get; set; }
public void Start()
{
var trigger = TriggerUtils.MakeMinutelyTrigger(1);
trigger.Name = @"文档导入触发器";
Scheduler.ScheduleJob(new JobDetail("文档导入", null, typeof(DocumentImportJob)), trigger);
Scheduler.AddGlobalJobListener(AutofacJobListener);
Scheduler.Start();
}