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

时间:2017-09-28 07:40:07

标签: c# quartz-scheduler quartz.net

我希望有一个简单的问题,我无法找到答案。

如果我按需安排LongRunningAndHeavyJob类型的作业(StartNow())我不知道这项工作将持续多长时间,但它可能很长(从10分钟到60多分钟)并且非常耗费CPU 。因为最终用户可以按需启动此作业,所以我希望确保此作业的一个实例在特定时间运行。

例如:

  1. John点击按钮时间表14:00:00
  2. Quartz.net服务器将运行此作业
  3. Jane在14:05:00点击按钮时间表,但John的工作仍在运行
  4. 我如何确保Jane的工作不会与约翰的工作同时运行,并且在约翰的工作完成后运行。

    属性DisallowConcurrentExecution仅供您使用,如果您的作业具有触发器,该触发器正在重复,我认为该作业需要具有我不具备的相同键。

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

    提前致谢

1 个答案:

答案 0 :(得分:3)

我解决了我面临的问题!

我是怎么做到的:

  1. 使用[DisallowConcurrentExecution]属性
  2. 修饰了长时间运行的作业
  3. 当Quartz服务器启动时,我将长时间运行的作业添加为Durable个作业而没有任何触发器。
  4. 在某人请求运行作业后,我会在触发器上设置JobData而不是作业,并通过仅向ScheduleJob方法提供触发器来计划作业(触发器使用{{1}方法)
  5. 这将确保在给定时间只有1个Job的实例运行,并且如果其他人触发相同的作业,它将被安排在第一个完成后运行并且线程池中有线程可用

    服务器部分:

    ForJob(IJobDetail)

    客户端部分:

    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()

    上写的扩展方法之一