小编Zar*_*Zar的帖子

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.
    }
}
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 类,因为传输的“主要”代码总是相同的,唯一的区别是表名。所以我想为此使用相同的工作类别。

parallel-processing quartz-scheduler quartz.net

3
推荐指数
1
解决办法
4197
查看次数