Quartz .NET - 防止并行作业执行

时间:2018-01-24 14:55:06

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

我正在使用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类,因为&#34; main&#34;传输的代码总是相同的,唯一的区别是表名。所以我想为此目的使用相同的工作类。

1 个答案:

答案 0 :(得分:1)

Quatz .NET文档有点令人困惑。

  

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

来源: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属性适用于我的目的。