我正在使用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;传输的代码总是相同的,唯一的区别是表名。所以我想为此目的使用相同的工作类。
答案 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属性适用于我的目的。