【问题标题】:Quartz .NET - Prevent parallel Job ExecutionQuartz .NET - 防止并行作业执行
【发布时间】:2018-01-24 14:55:05
【问题描述】:

我正在使用 Quartz .NET 进行作业调度。 所以我创建了一个工作类(实现 IJob)。

public class TransferData : IJob
{
    public Task Execute(IJobExecutionContext context){
       string tableName = context.JobDetail.JobDataMap.Get("table");
       // Transfer the table here.
    }
}

所以我想转移不同的和多个表。为此,我正在做这样的事情:

foreach (Table table in tables)
{
    IJobDetail job = JobBuilder.Create<TransferData>()
        .WithIdentity(new JobKey(table.Name, "table_transfer"))
        .UsingJobData("table", table.Name)
        .Build();

    ITrigger trigger = TriggerBuilder.Create()
        .WithIdentity(new TriggerKey("trigger_" + table.Name, "table_trigger"))
        .WithCronSchedule("*/5 * * * *")
        .ForJob(job)
        .Build();

    await this.scheduler.ScheduleJob(job, trigger);
}

所以每张桌子应该每 5 分钟转移一次。为了实现这一点,我创建了几个具有不同工作名称的工作。 问题是:如何防止同一个jobName的并行作业执行? (例如,一个表的上一次运行需要更长的时间,所以我不想为同一个表开始下一次传输。)

我知道@DisallowConcurrentExecution 属性,但这用于防止同一个Job 类的并行执行。我不想为每个表编写一个额外的 Job 类,因为传输的“主要”代码总是相同的,唯一的区别是表名。所以我想为此目的使用相同的工作类。

【问题讨论】:

    标签: parallel-processing quartz-scheduler quartz.net


    【解决方案1】:

    Quatz .NET 文档有点混乱。

    DisallowConcurrentExecution 是一个可以添加到 告诉 Quartz 不要执行多个实例的作业类 给定的工作定义(指给定的工作类别) 同时。注意那里的措辞,因为它被选中了 小心。在上一节的示例中,如果 “SalesReportJob”有这个属性,而不是只有一个实例 “SalesReportForJoe”可以在给定时间执行,但它可以执行 同时与“SalesReportForMike”的一个实例。约束 基于实例定义 (JobDetail),而不是 工作类。然而,它被决定了(在 Quartz 的设计过程中) 让类本身带有属性,因为它确实 通常会对类的编码方式产生影响。

    来源:https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/more-about-jobs.html

    但是,如果您阅读 API 文档,就会发现:粗体字很重要!

    将 IJob 类标记为不能具有的属性 多个实例同时执行(实例基于 IJobDetail 定义 - 或者换句话说,基于 JobKey)。

    来源:https://quartznet.sourceforge.io/apidoc/3.0/html/

    换句话说:DisallowConcurrentExecution 属性适用于我的目的。

    【讨论】:

      猜你喜欢
      • 2017-04-20
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多