.net - 在 Quartz.NET 中,有没有办法设置一个只允许一个 Job 实例运行的属性?

标签 .net quartz.net

我有一项每 X 分钟运行一次的服务。如果由于某种不可预见的原因该作业花费的时间超过 X 分钟,我想确保触发器不会启动该作业的第二个实例。

示例场景

  • 我有 Job X,拾取文件并由 Quartz 每 1 分钟触发一次。
  • 作业 X 通常可以在 1 分钟内处理 100 个文件,任何超过 100 个文件的时间都将超过 1 分钟。
  • 自上次运行以来,恰好有 150 个文件存在,因此 Job X 启动并开始处理。达到 1 分钟时,处理了 100 个文件,剩余 50 个文件,作业 X 继续运行。
  • 但是,由于触发器每 1 分钟触发一次,所以会启动 Job X 的第二个实例。
  • 我现在有 2 个 Job X 实例拾取相同的 50 个文件。

  • 有没有办法连接 Quartz.NET 只允许一个 Job 实例?我同意第二个触发器等待第一个触发器完成,或者我也可以选择跳过第二个触发器,因为它将在一分钟内再次触发。

    我查看了 Quartz API 的 Java 版本,发现了一个属性 'DisallowConcurrentExecution ' 但在 .NET 版本中没有找到类似的。

    我的 Quartz.NET 实现代码

    公共(public) IScheduler 调度程序 { 获取;放; }public IJobListener AutofacJobListener { 获取;放; }public void Start(){ var trigger = TriggerUtils.MakeMinutelyTrigger(1); trigger.Name = @"文档导入触发器"; Scheduler.ScheduleJob(new JobDetail("文档导入", null, typeof(DocumentImportJob)), trigger); Scheduler.AddGlobalJobListener(AutofacJobListener);调度程序.Start();}

    最佳答案

    作为对此答案的更新,在 Quartz.Net 的较新版本中,现在通过应用于作业实现的属性“DisallowConcurrentExecution”完成:

    [DisallowConcurrentExecution]
    public class MyJob : IJob  
    {
        ..
    }
    

    对于失火指令,这里是如何做到这一点的:
    var trigger = TriggerBuilder.Create()
        .WithSimpleSchedule(ssb => ssb.WithIntervalInMinutes(interval)
            .RepeatForever()
            .WithMisfireHandlingInstructionIgnoreMisfires()
        )
        .Build();
    

    关于.net - 在 Quartz.NET 中,有没有办法设置一个只允许一个 Job 实例运行的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5984220/

    相关文章:

    c# - 转换集合

    quartz.net - 将 Quartz.NET 与自定义连接提供程序一起使用

    c# - 如何从数据库动态重新安排 C# 中的 Quartz 作业调度程序?

    c# - 针对整个模式验证单个 XML 节点

    c# - Quartz.NET - 这个单元测试不应该通过吗?

    c# - 使用服务堆栈限制 Redis 消息队列的执行

    c# - Quartz.NET - 除周一凌晨 3 点外每小时运行一次

    c# - 使用 Google Contacts API v3,如何获取特定组的联系人?

    .NET 消费者/生产者(队列)

    c# - 如果等待的任务链上有 'unwrapped'任务,则Task.Result/wait(..)无限期等待,而如果使用 'async/await',则成功完成