function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
vali Palagiri 1vali Palagiri 1 

Help with CPU time limit Exception in batch apex

Hello fiends,

When i execute my batch apex i am getting the fatal error like "SerialBatchApexRangeChunkHandler    Apex CPU time limit exceeded".
Batch Apex:
global class Update_policy_status implements Database.Batchable<sObject>,Database.Stateful,Database.AllowsCallouts{

global list<string> subscribercontractid = new list<string>();
global list<string> responseid = new list<string>();
global list<string> membercontractid = new list<string>();
global list<string> groupresponseid = new list<string>();
global String query;
global String voidquery;
String csv = 'Policy Id, Sub/Mem_Contract_Id\n';
global String targetObjectname;
global Transaction_Log__c transactionLog;
global String message = System.now()+' : Policy Void Job Started.';
global list<Policy_Void_Criteria__c> UpdateVoidedstatus = new list<Policy_Void_Criteria__c>();
//string recname='A-1193844';

global Update_policy_status( list<Policy_Void_Criteria__c> PolicyVoidcriteria , String Objectname ){

query = 'Select id,Contract_or_Rate__c,Field_name__c,Target_Object__c,Voided_key__c,To_be_Voided__c from Policy_Void_Criteria__c where To_be_Voided__c = true and Target_Object__c = \''+Objectname+'\'';
targetObjectname = Objectname ;
}

global Database.QueryLocator start(Database.BatchableContext BC)
   {
        transactionLog = new Transaction_Log__c();
        transactionLog.Started_On__c = System.now();
        transactionLog.Type_of_Transaction__c = 'Policy Void Job';
        transactionLog.Status__c = 'In Progress';
        transactionLog.Logs__c = message;
        insert transactionLog;
        return Database.getQueryLocator(query);
   }
   
global void execute(Database.BatchableContext BC,List<sObject> sObjList)
   {   
    subscribercontractid = new list<string>();
    responseid = new list<string>();
    membercontractid = new list<string>();
    groupresponseid = new list<string>();
    UpdateVoidedstatus = new list<Policy_Void_Criteria__c>();
    
   Policyselection((list<Policy_Void_Criteria__c>)sObjList);  
   UpdatePolicydata(Database.query(voidquery)); 
   
       try{
            update UpdateVoidedstatus;
       }
       catch(Exception e)
       { 
           if(message.length()<30000)
            {
                message = message+'\n'+e.getMessage();
                transactionLog.Status__c = 'Failed';
                transactionLog.Ended_On__c = System.now();
                transactionLog.Logs__c = message;
                update transactionLog;
            }           
       }
   }
      
global void finish(Database.BatchableContext BC)
   { 
        message += '\n'+System.now()+' : Policy Void Job Completed for ' + targetObjectname ;
        transactionLog.Status__c = 'Policy Void Job Completed';
        transactionLog.Ended_On__c = System.now();
        transactionLog.Logs__c = message;
        update transactionLog;
        
        Attachment attach = new Attachment();
        attach.body = Blob.valueOf(csv);
        attach.Name = String.valueOf('Voided_Policy_file.csv');
        DateTime dt = Datetime.now();
        attach.ParentId = transactionLog.id; 
        insert attach;         
   }

public void Policyselection(list<Policy_Void_Criteria__c> voidlist){

    for (Policy_Void_Criteria__c PV : voidlist)
        {
            if(PV.Target_Object__c == 'vlocity_ins__Policy__c' && PV.Field_name__c == 'Subscriber_Contract_Id__c')
            {
              if(PV.Contract_or_Rate__c == 'SUBSCRIBER_CONTRACT')
              {
                subscribercontractid.add(PV.Voided_key__c);
              }
              else if(PV.Contract_or_Rate__c == 'RATE_RESPONSE')
              {
                responseid.add(PV.Voided_key__c);
              }
              else if(PV.Contract_or_Rate__c == 'GROUP_RATE')
              {
                groupresponseid.add(PV.Voided_key__c);
              }       
            }
            if(PV.Target_Object__c == 'vlocity_ins__PolicyPartyRelationship__c' && PV.Field_name__c == 'External_Id__c')
            {
              if(PV.Contract_or_Rate__c == 'MEMBER_CONTRACT')
              {
                membercontractid.add(PV.Voided_key__c);
              } 
            }
            PV.To_be_Voided__c = false;
            UpdateVoidedstatus.add(PV);
        }
        system.debug('criteria'+subscribercontractid);
        system.debug('criteria'+responseid);
        system.debug('criteria'+groupresponseid);
        if( targetObjectname == 'vlocity_ins__Policy__c') 
        voidquery = 'select Id,Subscriber_Contract_Id__c,Group_Policy_Id__c,Voided__c from vlocity_ins__Policy__c where Voided__c=false and (Rate_Response__c in: responseid OR Rate_Response__c in: groupresponseid OR Subscriber_Contract__c in: subscribercontractid) and (Rate_Response__c != NULL OR Rate_Response__c != NULL OR Subscriber_Contract__c != NULL)' ;
        else if(targetObjectname == 'vlocity_ins__PolicyPartyRelationship__c')
        voidquery = 'select Id,Voided__c,External_Id__c from vlocity_ins__PolicyPartyRelationship__c where Voided__c=false and Member_Contract__c in: membercontractid';
         system.debug('void query'+voidquery);      
    }   
   
   public void UpdatePolicydata(List<sObject> sObjList)
   {   
   
   list<vlocity_ins__Policy__c> Policylist = new list<vlocity_ins__Policy__c>();
   list<vlocity_ins__PolicyPartyRelationship__c> Policyrelationlist = new list<vlocity_ins__PolicyPartyRelationship__c>();
    system.debug('query is'+sobjList.size());
    if(sObjList.size()>0)
    {
        if(targetObjectname == 'vlocity_ins__Policy__c')  
        { 
            For(vlocity_ins__Policy__c Po : (list<vlocity_ins__Policy__c>)sObjList)
            {   
               system.debug('n is'+po); 
                Po.Voided__c = True ;
                Policylist.add(Po);
                system.debug('targetObjectname == vlocity_ins__Policy__c '+ Po);
                if(Po.Subscriber_Contract_Id__c != null && Po.Subscriber_Contract_Id__c != '')
                    { csv += Po.id + ',' + Po.Subscriber_Contract_Id__c.escapeCsv() + '\n'; system.debug('targetObjectname == vlocity_ins__Policy__c '+ Po);}
                if(Po.Group_Policy_Id__c != null && Po.Group_Policy_Id__c != '')
                    { csv += Po.id + ',' + Po.Group_Policy_Id__c.escapeCsv() + '\n'; system.debug('targetObjectname == vlocity_ins__Policy__c '+ Po);}
            }
            system.debug('n is'+csv);
            ProcessDatainChunk(Policylist);
        }
        if(targetObjectname == 'vlocity_ins__PolicyPartyRelationship__c')  
        {
            For(vlocity_ins__PolicyPartyRelationship__c PPR : (list<vlocity_ins__PolicyPartyRelationship__c>)sObjList)
            {
                PPR.Voided__c = True ;
                Policyrelationlist.add(PPR);
                csv += PPR.id + ',' + PPR.External_Id__c.escapeCsv() + '\n';
            }
            ProcessDatainChunk(Policyrelationlist);
        }
    } 
    System.debug ('############# '+ message); 
   
   }
   public void ProcessDatainChunk(List<sObject> sObjList)
   {
     integer i=0;
     integer j;
     
     list<sObject> lstsObject=new list<sObject>();
     map<id,sObject> mapsObj= new map<id,sObject>();
     
     while(i<sObjList.size())
     {
        for(j=i; j<i+3000; j++)
        {
            if(j<sObjList.size()) mapsObj.put(sObjList[j].id,sObjList[j]);
            else break;
        }
        try{
            update mapsObj.values();
        }
        catch(Exception e)
        {
            message += '\n'+System.now()+' : The Policy Void Update failed ' + e ;
        }
        i=j+1;  
        System.debug ('############# '+ message); 
        
     }
   }

}

Please help on this.