Как запланировать пакетный класс через каждые 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 ✌️

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *