Zar*_*Zar 3 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.
}
}
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 类,因为传输的“主要”代码总是相同的,唯一的区别是表名。所以我想为此使用相同的工作类别。
Quatz .NET 文档有点混乱。
DisallowConcurrentExecution 是一个可以添加到 Job 类的属性,它告诉 Quartz 不要同时执行给定作业定义(指给定作业类)的多个实例。注意那里的措辞,因为它是非常仔细地选择的。在上一节的示例中,如果“SalesReportJob”具有此属性,则在给定时间只能执行一个“SalesReportForJoe”实例,但它可以与“SalesReportForMike”实例同时执行。该约束基于实例定义 (JobDetail),而不是基于作业类的实例。然而,决定(在 Quartz 的设计过程中)将属性承载在类本身上,因为它通常会对类的编码方式产生影响。
来源: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 属性适用于我的目的。
| 归档时间: |
|
| 查看次数: |
4197 次 |
| 最近记录: |