Quartz.net 运行 1 个具有不同 JobKey 和 JobData 的作业实例

Quartz.net Run 1 instance of a job with different JobKey and JobData

我有一个希望很简单的问题,但我找不到答案。

如果我按需安排 LongRunningAndHeavyJob 类型的工作 (StartNow()) 我不知道这项工作会持续多长时间 运行 但它可能会很长(从 10 分钟到 60 分钟以上) 并且非常 CPU 密集。因为最终用户可以按需开始这项工作,所以我想确保在特定时间只有一个 运行ning 是这项工作的实例。

例如:

  1. John 在 14:00:00
  2. 单击按钮计划
  3. Quartz.net 服务器将 运行 此作业
  4. Jane 在 14:05:00 单击按钮日程安排,但 John 的工作仍在 运行ning

我如何确保 Jane 的工作不会与 John 的工作同时 运行,而是在 John 的工作完成后 运行。

属性 DisallowConcurrentExecution 仅在您的工作计划中使用我认为重复的触发器并且该工作需要具有我没有的相同密钥时使用。

一些额外信息: John 的工作与 Jane 的工作具有不同的 JobData

提前致谢

我解决了我面临的问题!

我是怎么做到的:

  1. [DisallowConcurrentExecution] 属性
  2. 修饰了长 运行ning 作业
  3. 当 Quartz 服务器启动时,我将长 运行ning 作业添加为 Durable 作业,没有任何触发器。
  4. 有人向 运行 请求作业后,我将在触发器上设置 JobData 而不是作业,并通过仅将触发器提供给 ScheduleJob 方法来安排作业(触发器使用 ForJob(IJobDetail) 方法)

这将确保在给定时间只有 1 个作业实例 运行 宁,如果其他人触发相同的作业,它将被安排在第一个作业之后 运行已完成并且线程池中有线程可用

服务器部分:

private void RegisterManualJobs() {
  var createTournamentScheduleJob = JobBuilder.Create<CreateTournamentScheduleJob>().WithIdentity("CreateTournamentSchedule", JobGroups.JG_TournamentScheduleJobs).StoreDurably().Build();
  var createTournamentScheduleSingleEventJob = JobBuilder.Create<CreateTournamentScheduleSingleEventJob>().WithIdentity("CreateTournamentScheduleSingleEvent", JobGroups.JG_TournamentScheduleJobs).StoreDurably().Build();

  Scheduler.AddJob(createTournamentScheduleJob,true);
  Scheduler.AddJob(createTournamentScheduleSingleEventJob,true);
}

客户端部分:

var job = Scheduler.GetJobByName("CreateTournamentSchedule", JobGroups.JG_TournamentScheduleJobs);
var trigger = TriggerBuilder.Create().StartNow().WithIdentity($"Trigger-CreateTournamentSchedule-{TournamentID}", JobGroups.JG_TournamentScheduleJobs).UsingJobData(data).ForJob(job).Build();
Scheduler.ScheduleJob(trigger);

GetJobByName() 是我在 IScheduler

上写的扩展方法之一