Как обработать внутреннюю ошибку Salesforce.com в SerialBatchApexRangeChunkHandler в Apex Batch - PullRequest
0 голосов
/ 08 мая 2018

Я обновляю несколько учетных записей в пакетном режиме. Но всякий раз, когда обновление завершается неудачно из-за некоторой логики проверки (в этом примере номер слишком длинный), пакет застревает в режиме обработки, и мне приходится прерывать его вручную. В журнале я вижу Операция: SerialBatchApexRangeChunkHandler Статус: Внутренняя ошибка Salesforce.com. Если я удаляю Database.Stateful, то пакет завершается, но мне нужно сообщить подробности ошибки в электронном письме, поэтому я должен это реализовать.

Пожалуйста, помогите мне и дайте мне знать, если потребуется дополнительная информация.

global class testBatchSettingsAndDebug implements Database.Batchable<sobject>, Database.Stateful {

    global String[] email= new String[] {'email@domain.com'};
    global List<Database.saveResult> dsrs = new List<Database.saveResult>();
    global String errorMessages {get; set;}
    global integer count=0;
    global List<String> exception_List;

    global testBatchSettingsAndDebug (){
        errorMessages ='';
    }


    //Start
        global Database.QueryLocator start (Database.BatchableContext bc){
            return Database.getQueryLocator('select id from Account limit 10');

        }    
    //Excecute
    global void execute (Database.BatchableContext bc, List<sobject> scope){
        List<Account > accToUpdateLsit = new List<Account >();//List to hold accs to update
        for (sObject objScope: scope) { 
            Account accObj = (Account )objScope ;//type casting from generic sOject to acc
            accObj.NumberofLocations__c= 123456;
            accToUpdateLsit.add(accObj);
         } 

         count=accToUpdateLsit.size();

         System.debug('Number of Records to update: '+accToUpdateLsit.size());



            if (accToUpdateLsit != null && accToUpdateLsit.size()>0) {//Check if List is empty or not
                dsrs = Database.update(accToUpdateLsit, false);
                System.debug('Records are successfully updated '+accToUpdateLsit);//Update the Records
            }




        for(Database.SaveResult dsr : dsrs){
            if(!dsr.isSuccess()){
                errorMessages += string.valueof(dsr.geterrors() + '\n'); 


           }
        }
        system.debug('Error occured: '+errorMessages);




    }

    //Finish
    global void finish (Database.BatchableContext BC){

       System.debug('**Record Updated**'+count);


       Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();

      //Below code will fetch the job Id
          AsyncApexJob a = [Select a.TotalJobItems, a.Status, a.NumberOfErrors, a.JobType, a.JobItemsProcessed, a.ExtendedStatus, a.CreatedById, a.CompletedDate From AsyncApexJob a WHERE id = :BC.getJobId()];//get the job Id
          System.debug('Jobid is'+BC.getJobId());

          //below code will send an email to User about the status
          mail.setToAddresses(email);
          mail.setReplyTo('email@domain.com');//Add here your email address
          mail.setSenderDisplayName('Account Batch Notification');
          mail.setSubject('Account Batch Batch Processing '+a.Status);
          mail.setPlainTextBody('The Batch Apex job processed:  '+a.TotalJobItems+' batches with: '+a.NumberOfErrors+' failures: '+' Error Messages:'+errorMessages );
          Messaging.sendEmail(new Messaging.Singleemailmessage [] {mail});



       System.debug('**Job completed**');

    }
}

1 Ответ

0 голосов
/ 09 мая 2018

Похоже, вы просто можете делать то, что упомянуто на рабочем столе, как: Объявите ваш Database.saveResult и переходный

...