我正在使用 Quartz .NET 进行作业调度。所以我创建了一个工作类(实现 IJob)。
public class TransferData : IJob
{
public Task Execute(IJobExecutionContext context){
string tableName = context.JobDetail.JobDataMap.Get("table");
// Transfer the table here.
}
}
Run Code Online (Sandbox Code Playgroud)
所以我想转移不同的和多个表。为此,我正在做这样的事情:
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);
}
Run Code Online (Sandbox Code Playgroud)
所以每张桌子应该每5分钟转移一次。为了实现这一点,我创建了几个具有不同作业名称的作业。问题是:如何防止相同jobName的并行作业执行?(例如,一张桌子的前一次运行需要更长的时间,所以我不想为同一张桌子开始下一次传输。)
我知道@DisallowConcurrentExecution 属性,但这用于防止同一作业类的并行执行。我不想为每个表编写一个额外的 Job 类,因为传输的“主要”代码总是相同的,唯一的区别是表名。所以我想为此使用相同的工作类别。