We can run 3 batch jobs sequentially by incrementing the jobCounter and passing the integer (job index) into the batch scope
This can be increased to any amount of batch jobs, the problem I solved was able to update the Contact and disable Users in the same code running as different batch job.
As you cannot call @future in a batch method this solves by running each update in their own batch = transaction 👍🏻
global with sharing class App_Job_Account_Delete implements System.Schedulable, Database.Batchable<Integer>, Database.Stateful, Database.AllowsCallouts {
private List<JobError> jobErrors = new List<JobError>();
global Integer jobCounter = 1;
public void execute(SchedulableContext sc) {
Database.executeBatch(this, jobCounter);
}
public Integer[] start(Database.BatchableContext context) {
return new Integer[] {jobCounter};
}
public void execute(Database.BatchableContext context, Integer[] scope) {
try{
if (isSandbox() || Test.IsRunningTest()){
if(scope[0] == 1) {
//add your code here to run as part of 1st batch
} else if (scope[0] == 2){
//add your code here to run as part of 2nd batch
} else if (scope[0] == 3){
//add your code here to run as part of 3rd batch
}
} else {
JobError jobError = new JobError();
jobError.message = 'Environment Error: Job will only run on dev and automation environment';
jobError.records = new List<SObject>();
jobErrors.add(jobError);
}
} catch (Exception ex){
JobError jobError = new JobError();
jobError.records = new List<SObject>();
jobError.message = 'Exception: ' + ex.getTypeName() + ': ' + ex.getMessage() + ' -- ' + ex.getCause();
jobErrors.add(jobError);
}
}
public void finish(Database.BatchableContext context){
if (jobCounter<3){
jobCounter++;
Database.executeBatch(this, jobCounter);
}
}
public class JobError{
public String message;
public List<SObject> records;
}
public void setJobError(List<JobError> jobErrors){
this.jobErrors = jobErrors;
}
public static Boolean isSandbox() {
if ([SELECT IsSandbox FROM Organization LIMIT 1].IsSandbox && ('Dev'.equalsIgnoreCase(CustomSettings.Environment__c) || 'Automation'.equalsIgnoreCase(CustomSettings.Environment__c))){
return true;
} else {
return false;
}
}
}
Run the code as
Id batchprocessid = Database.executeBatch(new App_Job_Account_Delete());