Задания, не связанные в цепочку с помощью JobChainingJobListener

#c# #quartz.net

#c# #quartz.net

Вопрос:

У меня есть текущий код для моего планировщика Quartz:

 var scheduler = StdSchedulerFactory.GetDefaultScheduler();

// Job1
var Job1 = JobBuilder.Create<Test1>().WithIdentity("job1", "group1").Build();
// Job2
var Job2 = JobBuilder.Create<Test2>().WithIdentity("job2", "group2").Build();

// Triggers
ITrigger trigger1 = TriggerBuilder.Create().WithIdentity("trigger1", "group1").StartNow().Build()
ITrigger trigger2 = TriggerBuilder.Create().WithIdentity("trigger2", "group2").StartNow().WithSimpleSchedule(x => x.WithIntervalInSeconds(1).WithRepeatCount(4)).Build();

// JobKeys
JobKey jobKey1 = new JobKey("Job1", "group1");
JobKey jobKey2 = new JobKey("Job2", "group2");

// Chain jobs
JobChainingJobListener chain = new JobChainingJobListener("testChain");
chain.AddJobChainLink(jobKey1, jobKey2);
scheduler.ScheduleJob(Job1, trigger1);
scheduler.AddJob(Job2, true);

// Global listener here. I am not sure what I have is correct.
scheduler.ListenerManager.AddJobListener(chain, GroupMatcher<JobKey>.AnyGroup());` 

scheduler.Start();
  

(Для пояснения, в данный момент задания не выполняют ничего, кроме печати на консоль.)

С веб-сайта Quartz я обнаружил, что это добавит JobListener, который интересуется всеми заданиями: scheduler.ListenerManager.AddJobListener(chain, GroupMatcher<JobKey>.AnyGroup()); я не уверен, что это эквивалентно глобальному прослушивателю.

Я также обнаружил, что некоторый код, который люди сделали scheduler.addGlobalJobListener(chain); на Java. Есть ли эквивалентный метод в c #?

Мой код компилируется и, похоже, выполняется без ошибок, но Job2 не запускается. Job1 правильно выводит данные на консоль.

Ответ №1:

Проблема здесь в том, что вы неправильно написали ключ во второй раз («Job1» против «job1»), что приводит к отсутствию известной ссылки для запуска. Вот обновленный пример кода с удаленными избыточностями.

 var scheduler = StdSchedulerFactory.GetDefaultScheduler();
JobKey jobKey1 = new JobKey("job1", "group1");
JobKey jobKey2 = new JobKey("job2", "group2");

var job1 = JobBuilder.Create<Test1>().WithIdentity(jobKey1).Build();
var job2 = JobBuilder.Create<Test2>().WithIdentity(jobKey2).StoreDurably(true).Build();

ITrigger trigger1 = TriggerBuilder.Create()
   .WithIdentity("trigger1", "group1")
   .StartNow()
   .Build();

JobChainingJobListener chain = new JobChainingJobListener("testChain");
chain.AddJobChainLink(jobKey1, jobKey2);
scheduler.ListenerManager.AddJobListener(chain, GroupMatcher<JobKey>.AnyGroup());

scheduler.ScheduleJob(job1, trigger1);
scheduler.AddJob(job2, true);

scheduler.Start();
  

scheduler.addGlobalJobListener Это старый API и более длинная часть серии 2.x . Вы должны использовать ListenerManager, как вы это сделали.

Комментарии:

1. А, понятно. Я неправильно понял, должно ли это быть имя задания («job1») или имя переменной задания («Job1»). Спасибо за помощь с этим разъяснением.

2. У меня есть еще один быстрый последующий вопрос. Кажется, что если я объединю задания в цепочку, второе задание будет запускаться после завершения каждого экземпляра первого задания. Например, если у меня триггер Job1 выполняется каждую минуту в течение 5 минут, Job2 также будет выполняться каждую минуту в течение 5 минут. Есть ли способ сделать так, чтобы Job2 запускался только один раз — по истечении 5 минут?

3. Я думаю, тогда вам нужна какая-то пользовательская логика. Вы можете запустить другое задание, используя контекст выполнения задания. Просто проверьте свои собственные предварительные условия, следует ли это делать.