Как запланировать пакетный класс через каждые X минут?
Недавно у меня возникла проблема, когда мне пришлось запланировать пакетное задание вершины, но в облаке опыта пакетное задание не получалось из-за технических ограничений.
Я испробовал весь механизм для выполнения пакета, например, предоставления набора разрешений пользователю, разрешения на уровне профиля, которое обеспечивает доступ пакетного класса к профилю. НО ПАРТИЯ НЕ БЫЛА ВЫПОЛНЕНА ЧЕРЕЗ EXPERIENCE CLOUD.
Итак, я пришел к альтернативе, в которой я запланировал пакет, используя класс планирования.
Решение требует, чтобы оно сначала проверяло, выполняется ли какое-либо другое существующее задание и выстраивается в линию для следующего выполнения, ПРЕКРАЩАЕТ его, а затем планирует другое задание в методе завершения пакетного класса.
global without sharing class AsynchronousProcessBatch implements Database.Batchable<sObject>,Database.AllowsCallouts,Database.Stateful{
global Database.QueryLocator start(Database.BatchableContext BC) {
String query = 'select query that fulfils the number of records here';
return Database.getQueryLocator(query);
}
global void execute(Database.BatchableContext BC,List<SObject> scope){
system.debug('scope :' + scope);
// Your BUSINESS LOGIC CLASS CALLED HERE
MYBusinessClass bgClass = new MYBusinessClass();
bgClass.myBusinessMethodCalled();
}
global void finish(Database.BatchableContext BC){
//Abort the existing job
Set<Id> crnJobDtSet = new Set<Id>();
List<CronJobDetail> cjDetailList = [SELECT Id, Name, JobType FROM CronJobDetail WHERE Name LIKE 'DocRqStarted at%'];
for(CronJobDetail cjd : cjDetailList){
crnJobDtSet.add(cjd.Id);
}
Set<Id> cronTriggerId = new Set<Id>();
List<CronTrigger> cronTriggerList = [SELECT Id, CronJobDetailId,CronJobDetail.Name, PreviousFireTime, State, StartTime,
EndTime, CronExpression, CreatedDate, TimesTriggered FROM CronTrigger WHERE CronJobDetailId IN :crnJobDtSet AND TimesTriggered > 0];
Set<Id> cronJobIds = (new Map<Id, CronTrigger>(cronTriggerList)).keyset();
for(Id cronId : cronJobIds){
System.abortJob(cronId);
}
String hour = String.valueOf(Datetime.now().hour());
//You can add any no of Minute you want to add to schedule it for next Here it is 2 mins
String min = String.valueOf(Datetime.now().addMinutes(2).minute());
String ss = String.valueOf(Datetime.now().second());
//parse to a cron expression
String nextFireTime = ss + ' ' + min + ' ' + hour + ' * * ?';
//Create an Instance of your Schedule Class
ScheduleMyJob s = new ScheduleMyJob();
System.schedule('DocRqStarted at' + String.valueOf(Datetime.now()), nextFireTime, s);
}
}
Также нам нужно создать запланированный класс, который вызывает этот пакет. Таким образом, партия непрерывно выполняется через каждые X минут. Кроме того, очистка заданий, которые уже выполнены.
global without sharing class SchedulerJob implements Schedulable{
global void execute(SchedulableContext sc)
{
AsynchronousProcessBatch b = new AsynchronousProcessBatch();
database.executeBatch(b, 1); // if you need to increase the chunk size then you can put any other number
}
}
Peace ✌️