We’re Heading to CNX ’25. Let's Meet in Chicago! Join HIC at Salesforce Connections'25 for conversations, collaboration, and co-creation.

As developers, we all have at some points, needed to check and track callout status, and sometimes it takes some extra effort to handle failure and then retry callout. And if the call out does not succeed on the second attempt, it becomes even more exhausting.

To handle callout failures, earlier we used to follow either of these two processes-

  1. Check the status of AsyncApexJob using a SOQL query and re-enqueue the job if it fails.
  2. Or fire BatchApexErrorEvents when a batch Apex method encounters an error or unhandled exception.

But this issue can now be resolved easily as Salesforce introduced the “Transaction Finalizers” feature in the Spring’21 release.

What is the “Transaction Finalizers” feature

Transaction Finalizers feature provides the capability to add actions to be taken when asynchronous jobs succeed or fail.

In other words, by using the System.Finalizer interface, it enables us to attach actions to asynchronous Apex jobs using the Queueable framework. Isn’t it amazing?

And the good part is that even a Queueable job that failed consecutively due to an unhandled exception can be successfully re-enqueued five times with Transaction finalizers.

Overview System.Finalizer Interface

This interface includes an execute(System.FinalizerContext cntx) method where we can define actions to take at the end of the Queuable job. Where argument FinalizerContext holds the instance of every enqueued job.

 

System.FinalizerContext interface contains four methods.

 

  1. global Id getAsyncApexJobId {}
  2. global String getRequestId {}
  3. global System.ParentJobResult getResult {}
  4. global System.Exception getException {}

Note:

  1. getAsyncApexJobId() return ID of Queueable job for which this finalizer is defined.
  2. System.ParentJobResult is an enum with value: SUCCESS, UNHANDLED_EXCEPTION

Implementation of Transaction Finalizer

We need to Attach the finalizer to our Queueable jobs using the System.attachFinalizer method.

This includes two steps-

Step 1

In the First step, define a class that implements the System.Finalizer interface.

Code

Step 2

Now, Attach a finalizer within a Queueable job’s execute method.

Code

Key Takeaway

  • A Queueable job can have only one Finalizer instance.
  • We can perform callout in Finalizer.
  • We can enqueue a single asynchronous Apex job (Queueable, Batch, or Future) in the finalizer’s implementation of the execute method.
  • Instead of using global finalizer use public

Conclusion

Thus, Say goodbye to callout failure tracking and handle failures with this efficient solution.

Feel free to reach us if you have any queries or need help with Salesforce Development solutions.

 

And, do not forget to keep an eye on our blog section as we will be back with another interesting blog soon. Till then, keep learning!

Related Articles
How to Use Platform Events in Salesforce Flow for Real Time Updates

Platform events in Salesforce Flow are a great tool for creating real-time, event-driven apps that automate business operations with precision and speed. By integrating Platform Events’ publish-subscribe approach with Salesforce Flow‘s low-code features, you can automate processes, allow real-time system interaction, and optimize how your organization manages dynamic data changes. This guide will demonstrate how […]

Read More
Build a Dynamic Salesforce Data Viewer with hange kardo bas LWC

Lightning Web Components (LWC) is a modern JavaScript framework that is used for building responsive, dynamic applications on the Salesforce platform. In LWC, data flows from parent-to-child component. Variables marked as @api in the child component are open for a parent to pass values directly into the child’s HTML template, making the component interactable. To […]

Read More
Expert Guide On Nominal XIRR Calculation Using LWC in Salesforce

When building financial tools within Salesforce, handling irregular cash flows with precision is a must. Whether you’re developing investment trackers, portfolio performance dashboards, or funding monitors, calculating Nominal XIRR (Extended Internal Rate of Return) becomes essential. In this blog, you’ll learn how to build a Lightning Web Component (LWC) in Salesforce that calculates Nominal XIRR […]

Read More
Beginners Guide to Making Your LWC Component Multilingual

If you’re wondering how to make your LWC component multilingual, you’re already ahead of the curve. Global users expect content in their native language, and Salesforce gives you the tools to deliver exactly that. With Custom Labels and the Translation Workbench, you can easily localize your Lightning Web Components without touching a single line of […]

Read More
Hands-On Guide Building a Drag-and-Drop Form Builder Using Lightning Web Components

Drag-and-drop interfaces are a user experience staple, and when paired with the power of Lightning Web Components (LWC), they unlock dynamic, highly interactive Salesforce components. In this blog post, we’ll walk you through how to build a custom drag-and-drop form builder in LWC. Users can drag form fields like text inputs and dropdowns into a […]

Read More
Please Make Blog Banner How to Create an Agentforce Enabled Scratch Org in Salesforce 100 1

Setting up an Agentforce-enabled scratch org is the most important step for developers who want to experiment with AI features such as Prompt Builder and Einstein GPT. Whether you’re developing the next generation CRM software or experimenting with how generative AI may improve user experience, a scratch org equipped with Agentforce is your playground. Follow […]

Read More
Our Location worldwide
Indian Flag India
3rd Floor, A-10, Pegasus Tower, Sector 68, Noida, Uttar Pradesh 201301 +91-1203117884
United States of America Flag USA
333 West Brown Deer Road Unit G – 366 Milwaukee WI, USA 53217 +1(262) 310-7818
United Kingdom Flag UK
7 Bell Yard, London, WC2A 2JR +44 20 3239 9428
Canada Canada
HIC Global Solutions INC
6D - 7398 Yonge St #1124 Thornhill, ON L4J 8J2 Canada +1(262) 310-7818