Close Menu
SalesforceCodex
    Facebook X (Twitter) Instagram
    Trending
    • Building a Dynamic Tree Grid in Lightning Web Component
    • 10 Salesforce Chrome Extensions to Boost Your Productivity
    • How to Build a Generic Modal Window in Lightning Web Component
    • Top 10 Salesforce Flow Features of Salesforce Summer ’25
    • Unlock the Power of Vibe Coding in Salesforce
    • How to Implement Dynamic Queueable Chaining in Salesforce Apex
    • How to Implement Basic Queueable Chaining in Salesforce Apex
    • How to Suppress PMD Warnings in Salesforce Apex
    Facebook X (Twitter) Instagram
    SalesforceCodex
    Subscribe
    Saturday, July 12
    • Home
    • Architecture
    • Salesforce
      • News
      • Apex
      • Integration
      • Books Testimonial
    • Questions
    • Certification
      • How to Prepare for Salesforce Integration Architect Exam
      • Certification Coupons
    • Integration Posts
    • Downloads
    • About Us
      • Privacy Policy
    SalesforceCodex
    Home»Salesforce»Apex»How to Implement Basic Queueable Chaining in Salesforce Apex

    How to Implement Basic Queueable Chaining in Salesforce Apex

    Dhanik Lal SahniBy Dhanik Lal SahniMarch 31, 2025Updated:April 24, 2025No Comments5 Mins Read
    Facebook Twitter Pinterest LinkedIn Tumblr Email
    Queueable Chaining in Salesforce Apex
    Share
    Facebook Twitter LinkedIn Pinterest Email

    Salesforce Queueable Apex is an asynchronous process that runs long processes efficiently in the background. Sometimes, we need to execute another queueable job on completion of the first job for handling business requests. This is called queueable chanining. This post will explain queueable chaining and how to implement it in Salesforce Apex.

    We can also handle job chaining using Salesforce Batch and Schedule Apex. For this post, we will use a Queueable Apex job.

    What is Queueable Chaining in Salesforce?

    Queueable Chaining is the process of executing a sequence of Salesforce queuable apex jobs, where one job enqueues another job after it completes execution. This allows sequential, asynchronous processing of tasks in Salesforce.

    Use Case for Queueable Chaining

    Medstore, a pharma company, sells medical products online. It needs order processing within the Salesforce system. It should validate orders, process payments, generate invoices, and then update inventory.

    Solution

    We can handle the above business request using queueable apex chaining. Below are two solutions for handling queueable apex

    1. Strong Coupled Solution
    2. Loose Coupled Solution

    In this post, we will explore a strongly coupled solution, and in another post, we will solve the above business requirement using the loose-coupled solution.

    Strong Coupled Solution

    In a strongly coupled solution, we place the next job name in the current job’s apex. As we put the next job in the current job itself, both apex jobs are tightly coupled. So we can not change the next job at runtime.

    Below are apex classes to handle business requests using strongly coupled architecture.

    ValidationQueueable:

    This queueble apex will validate orders and customer information for order processing. Once the order queueable logic is finished, it will put the PaymentQueueable job in the queue.

    public class ValidationQueueable implements Queueable {
    OrderRequest request;
    public ValidationQueueable(OrderRequest reqst)
    {
    request=reqst;
    }
    public void execute(QueueableContext context) {
    System.debug('ValidationQueueable Called with params:'+ request);
    //Put all Validation Logic here
    //....
    // At the end start PaymentQueueable Job
    System.enqueueJob(new PaymentQueueable(request));
    }
    }

    PaymentQueueable

    PaymentQueueable class will handle payment-related logic for order processing. It might be a new payment system addition or an existing wallet/card payment; it will handle all the business logic. Once all payment information is finished, we can add the next apex job, InvoiceQueueable in the queue.

    public class PaymentQueueable implements Queueable {
    OrderRequest request;
    public PaymentQueueable(OrderRequest reqst)
    {
    request=reqst;
    }
    public void execute(QueueableContext context) {
    System.debug('PaymentQueueable Called with params:'+ request);
    //Put all Payment Related Logic here
    //....
    // At the end start InvoiceQueueable
    System.enqueueJob(new InvoiceQueueable(request));
    }
    }

    InvoiceQueueable

    InvoiceQueueable will handle business logic related to invoicing. All document processing can be handled in this queueable. Once we finish invoicing logic, we can put InventoryQueueable apex in queue for execution.

    public class InvoiceQueueable implements Queueable {
    OrderRequest request;
    public InvoiceQueueable(OrderRequest reqst)
    {
    request=reqst;
    }
    public void execute(QueueableContext context) {
    System.debug('InvoiceQueueable Called with params:'+ request);

    //Put all Invoicing Related Logic here
    //....
    // At the end start InvoiceQueueable
    System.enqueueJob(new InventoryQueueable(request));
    }
    }

    InventoryQueueable

    InventoryQueueable apex jobs will handle inventory-related logic, like updating product inventory in the warehouse. If inventory goes beyond the minimum threshold, then it will send an email to the warehouse manager about the inventory.

    public class InventoryQueueable implements Queueable {
    OrderRequest request;
    public InventoryQueueable(OrderRequest reqst)
    {
    request=reqst;
    }
    public void execute(QueueableContext context) {
    System.debug('InventoryQueueable Called with params:'+ request);
    //Put all Inventory Related Logic here
    //....
    }
    }

    OrderRequest wrapper class has parameters that will be used to pass information to all queueable classes. These parameters will be passed from the first queueable class (ValidationQueueable).

    public class OrderRequest {
    public string customerId;
    public string paymentId;
    public string orderId;
    }

    To run the first queueable class, we can add a scheduler apex or invocable method. If we want to execute it from any user interface (LWC or Aura), then we can add controller class. To execute it from flow, we can add an invocable method. To run from developer console, execute below code

    System.enqueueJob(new ValidationQueueable(null));

    Benefits of this solution

    This solution is easy to implement, and even a new developer with little experience can handle it with guidance.

    Disadvantage of this solution

    This solution is tightly coupled, so if we need to remove or add a new queueable in the queue, then we have to change the code. We also have to test both queueable jobs; we even need to change a single queueable job.

    Similar Posts

    • Avoid Batch Apex and Use Queueable Class
    • Transaction Finalizers for Salesforce Queueable Job
    • Enhancing Performance with File Compression in Apex
    • How to Correctly Publish Platform Event Using Salesforce Apex
    • How to Manage Technical Debt in Salesforce
    • How to Elevate Your Career to Salesforce Architect
    • Handle Heap Size for Apex Code Optimization
    • Implementing Apex Cursors for Optimal Resource Management in Salesforce
    • Build Scalable Solutions with Salesforce
    • Dynamic Code Execution using Callable Interface
    • Optimizing Salesforce Apex Code
    • Revisit Asynchronous Apex : Type and Usage
    • Salesforce Interview Question for Asynchronous Apex
    • Top 20 Salesforce Developer Interview Questions
    • Queueable Vs Batch Apex In Salesforce
    apex Apex Chaining Async Jobs in Apex Asynchronous apex asynchronous processes in salesforce Queueable queueable apex queueable chaining salesforce salesforce apex Schedule Apex
    Share. Facebook Twitter Pinterest LinkedIn Tumblr Email
    Previous ArticleHow to Suppress PMD Warnings in Salesforce Apex
    Next Article How to Implement Dynamic Queueable Chaining in Salesforce Apex
    Dhanik Lal Sahni
    • Website
    • Facebook
    • X (Twitter)

    With over 18 years of experience in web-based application development, I specialize in Salesforce technology and its ecosystem. My journey has equipped me with expertise in a diverse range of technologies including .NET, .NET Core, MS Dynamics CRM, Azure, Oracle, and SQL Server. I am dedicated to staying at the forefront of technological advancements and continuously researching new developments in the Salesforce realm. My focus remains on leveraging technology to create innovative solutions that drive business success.

    Related Posts

    By Dhanik Lal Sahni4 Mins Read

    Building a Dynamic Tree Grid in Lightning Web Component

    June 29, 2025
    By Dhanik Lal Sahni9 Mins Read

    10 Salesforce Chrome Extensions to Boost Your Productivity

    June 1, 2025
    By Dhanik Lal Sahni4 Mins Read

    How to Build a Generic Modal Window in Lightning Web Component

    May 26, 2025
    Add A Comment
    Leave A Reply Cancel Reply

    Expert Salesforce Developer and Architect
    Ranked #1 SALESFORCE DEVELOPER BLOG BY SALESFORCEBEN.COM
    Featured on Top Salesforce Developer Blog By ApexHours
    Recent Posts
    • Building a Dynamic Tree Grid in Lightning Web Component
    • 10 Salesforce Chrome Extensions to Boost Your Productivity
    • How to Build a Generic Modal Window in Lightning Web Component
    • Top 10 Salesforce Flow Features of Salesforce Summer ’25
    • Unlock the Power of Vibe Coding in Salesforce
    Ranked in Top Salesforce Blog by feedspot.com
    RSS Recent Stories
    • Discover the Top 10 Salesforce AppExchange Apps to Boost Productivity July 10, 2025
    • Top 20 Salesforce Data Cloud Interview Questions & Answers for Admins June 5, 2025
    • How to Connect Excel to Salesforce to Manage Your Data and Metadata February 9, 2025
    • Difference Between With Security and Without Security in Apex January 2, 2025
    • Top Reasons to Love Salesforce Trailhead: A Comprehensive Guide December 5, 2024
    Archives
    Categories
    Tags
    apex (112) apex code best practice (8) apex rest (11) apex trigger best practices (4) architecture (22) Asynchronous apex (9) AWS (5) batch apex (9) batch processing (4) code optimization (8) custom metadata types (5) design principle (9) einstein (3) flow (15) future method (4) google (6) google api (4) integration (19) integration architecture (6) lighting (8) lightning (66) lightning-combobox (5) lightning-datatable (10) lightning component (32) Lightning web component (64) lwc (53) named credential (8) news (4) optimize apex code (4) Permission set (4) Queueable (9) rest api (23) S3 Server (4) salesforce (143) salesforce apex (48) salesforce api (4) salesforce api integration (5) salesforce bulk api (3) Salesforce Interview Question (4) salesforce news (5) salesforce question (5) solid (6) tooling api (5) Visual Studio Code (3) Winter 20 (8)

    Get our newsletter

    Want the latest from our blog straight to your inbox? Chucks us your detail and get mail when new post is published.
    * indicates required

    Facebook X (Twitter) Instagram Pinterest YouTube Tumblr LinkedIn Reddit Telegram
    © 2025 SalesforceCodex.com. Designed by Vagmine Cloud Solution.

    Type above and press Enter to search. Press Esc to cancel.

    Ad Blocker Enabled!
    Ad Blocker Enabled!
    Our website is made possible by displaying online advertisements to our visitors. Please support us by disabling your Ad Blocker.