Queueable Apex vs Batch Apex

Queueable Apex vs Batch Apex | Salesforce Developer Guide

Queueable Apex

Apex processes that run for a long time, such as extensive database operations or external web service callouts, can be run asynchronously by implementing the Queueable interface and adding a job to the Apex job queue.

Queueable jobs:

  • Getting an ID for the job
  • Using non-primitive types
  • Can do 50 chaining jobs (one queue can call to another queue)

Queueable Syntax

public class TestDemoQueueable implements Queueable {
    public void execute(QueueableContext qCntxt) {
        Account a = new Account(Name='Acme',Phone='(415) 555-1212');
        insert a;        
    }
}

To add this class as a job on the queue, call this method:

ID jobID = [Method] System.enqueueJob(new TestDemoQueueable()); //Instantiate

[Method] can be called from the anonymous window and other classes & Triggers.

Governor limit is 10k record DML updates in one transaction.

AsyncApexJob jobInfo = [SELECT Status,NumberOfErrors FROM AsyncApexJob WHERE Id=:jobID];

Chaining:

public class FirstQueueableclsExample implements Queueable{
    public void (QueueableContext context){
        //further processing.
        System.enqueueJob(new SecondJob()); //chaining of Jobs.
    }
}

Example: Create Contact with Name for Account created

dont miss out iconDon't forget to check out: Callouts from Batch Apex and Calling One Batch Apex to Another Batch | Salesforce Tutorial Guide

Queueable Class

public class ContactCreationQueueable implements Queueable{
    private List<Account> accListToCreateContacts;
    public ContactCreationQueueable(List<Account> expectingAccountFromTrigger){
        this.accListToCreateContacts=expectingAccountFromTrigger;        
    }
    public void execute(QueueableContext qCntxt){
        List<Contact> contactToUpdate =new List<Contact>();        
        //Loop on all accounts that are inserted.
        for(Account acc:accListToCreateContacts){
            Contact con= new Contact();
            con.LastName=acc.Name;
            con.AccountId=acc.Id;
            contactToUpdate.add(con); //Add each Contact to List
        }
        if(contactToUpdate.size()>0){
            Insert contactToUpdate;            
        }        
    }    
}

Trigger

trigger AccountTriggerQueue on Account (after insert) {
    if(Trigger.isAfter && Trigger.isInsert){
        system.enqueueJob(new ContactCreationQueueable(Trigger.new)); //Chaining        
    }
}

Limitation

  • Queueable can't handle millions of records in one job.
  • Only one job can be scheduled at a time.
  • In the developer edition stack depth for chaining the jobs is limited to 5 including the parent job.

Batch Apex

  • Batch apex is used to run large jobs (like millions) that would exceed normal processing units.
  • Using Batch apex, we can process records asynchronously in batches.
  • Batch apex processes up to 50million records in the background, unlike Future and Queueable.

Batch Apex Syntax

public class MyClass implements Database.Batchabale{
    Start(){
        //Query all the records to process.
    }
    Execute(){
        //Process batch of records from the start.
        Finish(){
            //Any post processing logic Eg:send Mail
        }
    }
}

Batch apex methods:

  • Start().
  • Execute().
  • Finish().

How Batch Apex Works

Start(): query all records :lets say 100000 [Sends 2000 records every time(Maximum BatchSize)]

Execute(): going to process 20000 records only

Finish(): Post-Processing and another task like sending mail or handling exception.

Batch Size

  • Minimum batch size -1
  • Maximum batch size -2000
  • Default will be -200

Way of Calling:

Database.executeBatch=(new MyClass(),2000);
ExampleBatchClass myBatchObject = new ExampleBatchClass();
Id batchId = Database.executeBatch(myBatchOBject);

Example:

public class TestDemoBatch implements Database.Batchable<Sobject>{
    public Database.QueryLocator start(Database.BatchableContext bc){
        return Database.getQueryLocator('Select Id, name from Account');
    }
    public void execute(Database.BatchableContext bc , List<Account> subListFromStartMethod){
        for(Account acc:subListFromStartMethod){
            acc.Name='Demo Batch-'+acc.Name;
        }
        UPDATE subListFromStartMethod;
    }
    public void finish(Database.BatchableContext bc){
        System.debug('@@Post Processing Done');
        Database.execute(new BatchClass2()); //Chaining of Batch Jobs
    }
}

dont miss out iconCheck out an amazing Salesforce video tutorial here: Apex Scheduler in Salesforce | Asynchronous Apex

Batch Apex over Queueable

  • It allows the processing 50million of records in the background
  • Best suitable for long-running processes

Limitation

  • Can have only 5 batch jobs running at a time.
  • Execution may be delayed due to server availability.
  • @Future methods are not allowed.
  • Future methods cannot be called from Batch Apex.

Using Queueable Over Batch Apex:

  • A future method runs in the background, asynchronously. We can call a future method for executing long-running operations, such as callouts to external web services or other operations, on its own time as we can't call future methods from the batch class.
  • It comes in handy when we need to have both the operations of Batch and Future method and it should implement Queueable Interface.
  • Queueable apex can be called from the Future and Batch class.
  • Moreover Queueable apex supports getContent/getContentAsPDF() method.
  • In Queueable apex, we can chain up to 50 jobs and in developer edition, we can chain up to 5 jobs only whereas in BatchApex 5 concurrent jobs are allowed to run at a time.

Responses

Popular Salesforce Blogs