There are a few things that @future did not provide:
- @future requires the arguments be primitives, which means reconstructing a structure once the method is called.
- Difficult access to job ID. The executeBatch method returns a jobID, while calling an @future job does not give you the ID of the related job.
- No chaining – Chaining of batch apex is not allowed.
Queueable jobs are similar to future methods in that they’re both queued for execution, but they provide you with these additional benefits.
Getting an ID for your job: When you submit your job by invoking the System.enqueueJob method, the method returns the ID of the new job. This ID corresponds to the ID of the AsyncApexJob record.
This ID helps you identify your job and monitor its progress, either through the Salesforce user interface in the Apex Jobs page, or programmatically by querying your record from AsyncApexJob.
Using non-primitive types: Your queueable class can contain member variables of non-primitive data types, such as sObjects or custom Apex types.
Chaining Jobs: In queueable you can also chain Jobs from a running job. It is very helpful if some processing needs to be done which depends on the last results.
Example:
This example is an implementation of the Queueable interface. The execute method in this example inserts a new account.
public class QueueableExample implements Queueable {
public void execute(QueueableContext context) {
Account acc = new Account(Name=’Test Account Neeraj’);
Insert acc;
}
}
To add this class as a job on the queue, call this method:
ID jobID = System.enqueueJob(new QueueableExample());
After you submit your queueable class for execution, the job is added to the queue and will be processed when system resources become available. We can monitor the status of our job programmatically by querying AsyncApexJob or through the user interface Setup –> Monitor –> Jobs –> Apex Jobs.
Test class for queueable apex:
@isTest
public class AsyncExecutionExampleTest {
static testmethod void testAccount() {
Test.startTest();
System.enqueueJob(new QueueableExample());
Test.stopTest();
Account acct = [SELECT Name FROM Account WHERE Name=’Test Account Neeraj’ LIMIT 1];
System.assertEquals(‘Test Account Neeraj’, acct.Name);
}
}
Few things can be noted here:
- The execution of a queued job counts against the shared limit for asynchronous Apex method executions.
- We can add up to 50 jobs to the queue with System.enqueueJob in a single transaction.
- Use Limits.getQueueableJobs() to check how many queueable jobs have been added in one transaction.
- No limit is enforced on the depth of chained jobs.
- We can add only one job from an executing job with System.enqueueJob, that means only child job can exist for parent queueable job.
very nice post, i certainly love this website, keep on it
Hi there! Quick question that’s totally off topic. Do you know how to make your site mobile friendly? My site looks weird when viewing from my iphone. I’m trying to find a theme or plugin that might be able to resolve this problem. If you have any suggestions, please share. Appreciate it!