Welcome to my blog

I have been working with Salesforce for quite a while, so don’t hesitate to contact me if you have any questions or want some advice.

s f

Subscribe
Follow Us
h

Alternative solution for Apex Batch job? Apex Queueable – Use Case

 . Apex  . Alternative solution for Apex Batch job? Apex Queueable – Use Case

Alternative solution for Apex Batch job? Apex Queueable – Use Case

Alternative Solution For Apex Batch Job? Queueable – Use Case

Many client have apex batch queue limitation – means only 5 apex queue can be execute at same time, many client crossing 5 queue and waiting for long time in “Queued” job.

To over come that limitation – salesforce has another feature called “Apex Queueable”. This interface work as future call but you can chain the same Queueable job again and again OR other Queueable job.

When you want to process thousands of records and do some business logic and update salesforce data or callout to external system – you can use Queueable interface to process partial data and chain same job again continue remaining records.

Use Case:

Daily job need to update account with sum of closed opportunity amount.

Problem:

there are N number batch job running over the night. We can’t use apex batch job to archive this functionality.

Solution:

We can use Apex Queueable to process 100 account per execution and chain the same job to run again and again.

Sample Code:

public class queueableApexJob implements Queueable {

    public void execute(QueueableContext context) {
        //Pulling 100 accounts per transaction
        map<Id, Account> mapAccount = new map<Id, Account>([Select Id, Acc_Opportunity_Total__c,Amount_Cal_Processed_Date__c from Account where Amount_Cal_Processed_Date__c != TODAY limit 100]);
        //Pulling opportunity that closed today based on above Accounts
        list<Opportunity> lstOpportunity = [Select Id, AccountId, Amount from Opportunity where AccountId =:mapAccount.keySet() and CloseDate = TODAY];
        //Processing opportunity and populating sum of opportunity amount
        for(Opportunity iterator : lstOpportunity) {
            mapAccount.get(AccountId).Acc_Opportunity_Total__c += iterator.Amount;
            mapAccount.get(AccountId).Amount_Cal_Processed_Date__c = TODAY;
        }
        if(mapAccount.size() > 0) {
            //Updating Account
            update mapAccount.values();
            //This will stop when there is not account to process
            System.enqueueJob(new queueableApexJob()); //Chained same job again to process remaining records
        }
    }

}

Click here to read more about Queueable and Limitations.

Post a Comment