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

Parallel processing Quartz.NET-防止并行作业执行,parallel-processing,quartz-scheduler,quartz.net,Parallel Processing,Quartz Scheduler,Quartz.net,我正在使用Quartz.NET进行作业调度。 所以我创建了一个job类(实现IJob) 所以我想传输不同的多个表。为此,我做了如下工作: foreach (Table table in tables) { IJobDetail job = JobBuilder.Create<TransferData>() .WithIdentity(new JobKey(table.Name, "table_transfer")) .UsingJobData(

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

所以我想传输不同的多个表。为此,我做了如下工作:

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);
}
foreach(表中的表)
{
IJobDetail job=JobBuilder.Create()
.WithIdentity(新作业密钥(table.Name,“table_传输”))
.UsingJobData(“table”,table.Name)
.Build();
ITrigger trigger=TriggerBuilder.Create()
.WithIdentity(新触发器键(“触发器”+表名,“表触发器”))
.随附附件(“*/5****”)
.ForJob(job)
.Build();
等待这个.scheduler.ScheduleJob(作业,触发器);
}
所以每5分钟就要转移一次桌子。为了实现这一点,我创建了几个具有不同工作名称的工作。 问题是:如何防止对同一jobName执行并行作业?(例如,上一次运行一个表需要更长的时间,因此我不想为同一个表启动下一次传输。)


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

Quatz.NET文档有点混乱

DisallowConcurrentExecution是可以添加到 告诉Quartz不要执行多个实例的作业类 给定作业定义(指给定的作业类别) 同时注意这里的措辞,因为它被选得非常好 小心在上一节的示例中,如果 “SalesReportJob”具有此属性,而不是只有一个 “SalesReportForJoe”可以在给定的时间执行,但它可以执行 与“SalesReportForMike”实例同时出现。约束 基于实例定义(JobDetail),而不是基于 职业课。但是,已决定(在石英设计期间) 在类本身上携带该属性,因为它 通常会对类的编码方式产生影响

资料来源:

但是如果您阅读API文档,它会说:粗体文本很重要

将IJob类标记为不能具有 并发执行的多个实例(其中实例基于 IJobDetail定义-或者换句话说,基于JobKey的定义

资料来源:

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

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);
}