【发布时间】:2011-08-24 11:05:30
【问题描述】:
我有一个每 X 分钟运行一次的服务。如果由于某种不可预见的原因该作业花费的时间超过 X 分钟,我想确保触发器不会启动该作业的第二个实例。
示例场景
- 我有 Job X,拾取文件并由 Quartz 每 1 分钟触发一次。
- 作业 X 通常可以在 1 分钟内处理 100 个文件,超过 100 个文件的处理时间将超过 1 分钟。
- 自上次运行以来,恰好有 150 个文件存在,因此作业 X 启动并开始处理。当达到 1 分钟时,处理了 100 个文件,剩余 50 个文件,作业 X 继续运行。
- 但是,由于触发器每 1 分钟触发一次,因此会启动 Job X 的第二个实例。
- 我现在有 2 个作业 X 实例拾取相同的 50 个文件。
有没有办法连接 Quartz.NET 以只允许一个 Job 的 1 个实例?我可以接受第二个触发器等待第一个触发器完成,或者我也可以选择跳过第二个触发器,因为它将在一分钟内再次触发。
我查看了 Quartz API 的 Java 版本,发现了一个属性“DisallowConcurrentExecution”,但在 .NET 版本中没有找到类似的属性。
我的 Quartz.NET 实现代码
公共 IScheduler 调度程序 { 获取;放; }公共 IJobListener AutofacJobListener { get;放; }
public void Start()
{
var trigger = TriggerUtils.MakeMinutelyTrigger(1);
trigger.Name = @"Document Import Trigger";
Scheduler .ScheduleJob(new JobDetail("文档导入", null, typeof(DocumentImportJob)), trigger);
Scheduler.AddGlobalJobListener(AutofacJobListener);
Scheduler.Start();
}
【问题讨论】:
-
如果在前一个计划仍在运行的情况下,计划再次“结束”会发生什么?推迟还是跳过?
-
跳过或推迟,我都可以选择。
-
你不能在它运行时简单地设置一个变量或其他东西吗? IE。让工作“开始”,它会立即退出。
-
在你的函数内部实现逻辑应该比较简单。
-
我已按照您的建议尝试并标记为答案。但我无法解决问题。请检查github中的问题。我应该怎么做才能解决这个问题? github.com/quartznet/quartznet/issues/469
标签: .net quartz.net