Регистрация  |  Вход

AsyncApexJob vs CronTrigger

Пытаюсь завершить 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]