Пытаюсь завершить Scheduled Job программно.
Вроде раньше работало что найдя AsyncApexJob можно было сделать System.abortJob(jobId) и задача остановится.
Сейчас получил такую ошибку
You can't abort scheduled Apex jobs by calling System.abortJob with an AsyncApexJob ID. Call System.abortJob with the parent CronTrigger ID.
Чет с ходу не нагугливается как связать между собой AsyncApexJob и CronTrigger и достать второй из первого.
У кого есть решение под рукой, буду признателен.
Пытаюсь завершить Scheduled Job программно. Вроде раньше работало что найдя AsyncApexJob можно было сделать System.abortJob(jobId) и задача остановится. Сейчас получил такую ошибку [b]You can't abort scheduled Apex jobs by calling System.abortJob with an AsyncApexJob ID. Call System.abortJob with the parent CronTrigger ID.[/b] Чет с ходу не нагугливается как связать между собой AsyncApexJob и CronTrigger и достать второй из первого. У кого есть решение под рукой, буду признателен.
Да, есть косяк конечно в SF - нет прямой связи между AsyncApexJob и CronTrigger.
Зная ApexClass name можно найти AsyncApexJob, а вот чтобы остановить Scheduler Job нужен CronTrigger.
Можно конечно попытаться вычислить косвенную связь по других признакам, но я так глубоко мне копал (не понадобилось).
Запуская scheduler программно просто сохраняем Id которое нам вернулось или работаем через уникальное имя.
Запуск
Integer schedulerIntervalInHours = 1;
Integer h = DateTime.now().hourGmt() < 23 ? DateTime.now().hour()+1 : 0;
String CRON_EXP = '0 0 '+String.valueOf(h)+'/'+SchedulerIntervalInHours+' * * ?';
ServiceScheduler sch = new ServiceScheduler();
Id cronId = System.schedule('SomeSuperUniqueName', CRON_EXP, sch);
Остановка
List<CronTrigger> availableCrons = [SELECT Id FROM CronTrigger WHERE CronJobDetail.Name = 'SomeSuperUniqueName'];
for (CronTrigger cron : availableCrons)
System.abortJob(cron.Id);
}
Да, есть косяк конечно в SF - нет прямой связи между AsyncApexJob и CronTrigger. Зная ApexClass name можно найти AsyncApexJob, а вот чтобы остановить Scheduler Job нужен CronTrigger. Можно конечно попытаться вычислить косвенную связь по других признакам, но я так глубоко мне копал (не понадобилось). Запуская scheduler программно просто сохраняем Id которое нам вернулось или работаем через уникальное имя. Запуск [code] Integer schedulerIntervalInHours = 1; Integer h = DateTime.now().hourGmt() < 23 ? DateTime.now().hour()+1 : 0; String CRON_EXP = '0 0 '+String.valueOf(h)+'/'+SchedulerIntervalInHours+' * * ?'; ServiceScheduler sch = new ServiceScheduler(); Id cronId = System.schedule('SomeSuperUniqueName', CRON_EXP, sch); [/code] Остановка [code] List<CronTrigger> availableCrons = [SELECT Id FROM CronTrigger WHERE CronJobDetail.Name = 'SomeSuperUniqueName']; for (CronTrigger cron : availableCrons) System.abortJob(cron.Id); } [/code]