#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. Я думаю, тогда вам нужна какая-то пользовательская логика. Вы можете запустить другое задание, используя контекст выполнения задания. Просто проверьте свои собственные предварительные условия, следует ли это делать.