簡體   English   中英

Quartz.net使用不同的JobKey和JobData運行1個作業實例

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

我有一個希望是一個簡單的問題,我無法找到答案。

如果我根據需要安排一個類型為LongRunningAndHeavyJob的作業(StartNow())我不知道這個作業將運行多長時間,但它可能很長(從10分鍾到60多分鍾)並且非常(StartNow()) CPU。 因為最終用戶可以按需啟動此作業,所以我希望確保此作業的一個實例在特定時間運行。

例如:

  1. 約翰在14:00:00點擊按鈕時間表
  2. Quartz.net服務器將運行此作業
  3. Jane在14:05:00點擊按鈕時間表,但John的工作仍在運行

我如何確保Jane的工作不會與約翰的工作同時運行,並且將在約翰的工作完成后運行。

DisallowConcurrentExecution屬性僅供您使用,如果您有一個帶有觸發器的計划作業,我認為該作業需要具有我沒有的相同鍵。

一些額外的信息:約翰的約伯有不同的工作數據而不是簡的工作

提前致謝

我解決了我面臨的問題!

我是怎么做到的:

  1. 使用[DisallowConcurrentExecution]屬性修飾了長時間運行的作業
  2. 當Quartz服務器啟動時,我將長時間運行的作業添加為Durable作業而沒有任何觸發器。
  3. 有人請求作業運行后,我將在觸發器而不是作業上設置JobData ,並通過僅將觸發器提供給ScheduleJob方法來調度作業(觸發器使用ForJob(IJobDetail)方法)

這將確保在給定時間只有一個Job作業實例運行,如果其他人觸發了同一個作業,它將被安排在第一個作業完成后運行並且線程池中有線程可用

服務器部分:

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編寫的擴展方法之一

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM