How to use Queueable interface in Apex

Beach seats
Reading Time: 2 minutes

Queueable interface allows apex developers to run complex, lengthy, and asynchronous processes that normally couldn’t be run in synchronous invocations. Queueables are simple to implement and provide several advantages over the old @future annotation, making them a great way to make sure your apex code runs reliably and efficiently.

Async processing is an efficient way to run our algorithms. This mostly involves queues to control how many executions are being processed at a time. Different languages and platforms implement async processing in different ways but the idea is the same. One of the ways (yes, there are more than one) in Salesforce to execute some algorithms that require heavy processing, is the interface Queueable. Another example is the annotation @future but we will put our focus on implementing the interface Queueable in Apex classes.

One of the big challenges for most of the async processing approaches is the absence of order on the execution. This is kind of “Do it when possible”.

In this example we are just inserting a new account. You may think that’s not a heavy operation but what if your org is full of Flows (Process Builder) or triggers that are being executed every time an account is inserted? CPU limit errors will appear soon unless you stay away of the main thread execution.

By using queueable, you will stay away from limits, especially CPU limits.

public class MyQueueable implements Queueable{
    private final String myAttribute;
    public MyQueueable(String myAttribute){
        this.myAttribute = myAttribute;

    public void execute(QueueableContext context) {
	System.debug('executing with: '+myAttribute);
        // do some heavy work      
        Account a = new Account(Name=myAttribute);
        insert a;

        // enqueue another job if you wish

    public static void enqueueJob(){
        ID jobID = System.enqueueJob(new MyQueueable('my test param'));
        System.debug('job id: '+jobID);

How to enqueue our job

ID jobID = System.enqueueJob(new MyQueueable('my test param'));

Or you can create a method to use it as a shortcut


How to monitor Apex Jobs

You can monitor Apex Jobs from Setup -> Environments -> Jobs -> Apex Jobs. Also you can query your job in case you have to something we them from your code or you just like monitor this way.

SELECT Status,NumberOfErrors, ExtendedStatus 
FROM AsyncApexJob 

How to write unit tests for Apex Jobs

public class MyQueueableTest {

    static void myTest() {
        String param = 'tes param '+Math.random();
        // startTest/stopTest block to force async processes to run in the test.
        System.enqueueJob(new MyQueueable(param));
        // Validate that the job has run by verifying that the record was created.
        Account acct = [SELECT Name FROM Account WHERE Name = :param LIMIT 1];
        System.assertEquals(param, acct.Name);

Salesforce docs for Queueable


About the author

Andrés Canavesi
Andrés Canavesi

Software Engineer with 15+ experience in software development, specialized in Salesforce, Java and Node.js.

Related posts

Leave a Reply

%d bloggers like this: