【问题标题】:Quartz.net Run 1 instance of a job with different JobKey and JobDataQuartz.net 使用不同的 JobKey 和 JobData 运行 1 个作业实例
【发布时间】:2017-09-28 07:40:07
【问题描述】:

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

如果我按需安排LongRunningAndHeavyJob 类型的作业(StartNow()) 我不知道该作业将运行多长时间,但它可能会很长(从 10 分钟到 60 多分钟)并且非常占用 CPU。因为最终用户可以按需启动此作业,所以我想确保在某个时间只有该作业的一个实例正在运行。

例如:

  1. 约翰在 14:00:00 点击按钮时间表
  2. Quartz.net 服务器将运行此作业
  3. Jane 在 14:05:00 单击了按钮计划,但 John 的工作仍在运行中

我如何确保 Jane 的作业不会与 John 的作业同时运行,并且会在 John 的作业完成后运行。

属性DisallowConcurrentExecution 仅在您有一个计划的作业时使用,我认为该作业带有重复的触发器,并且该作业需要具有我没有的相同键。

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

提前致谢

【问题讨论】:

  • 你是对的 DisallowConcurrentExecution 在你的情况下没用。你可以看看here,这和你的问题类似,我描述了如何解决这个问题。
  • @Rabban 感谢您向我指出这个方向,但这并不是我想要的。我现在以不同的方式修复了它,我很快就会发布答案

标签: c# quartz-scheduler quartz.net


【解决方案1】:

我解决了我面临的问题!

我是怎么做到的:

  1. 使用[DisallowConcurrentExecution] 属性装饰了长时间运行的作业
  2. 当 Quartz 服务器启动时,我将长时间运行的作业添加为 Durable 作业,而无需任何触发器。
  3. 在有人请求运行作业后,我将在触发器上设置 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上写的扩展方法之一

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多