Hello folks, today we are going to discuss Future Methods in Apex Salesforce. Future Apex is used to run processes in a separate thread, at a later time when system resources become available. A future method runs in the background, asynchronously.
Also, check this: Implement Iteration for:each directives in LWC
Key Highlights :
- A future method for executing long-running operations, such as callouts to external Web services or any operation you’d like to run in its own thread, on its own time.
- Use @future annotation before method declaration.
- Run asynchronously.
- Use future methods to isolate DML operations on different sObject types to prevent the mixed DML error.
- A benefit of using future methods is that some governor limits are higher, such as SOQL query limits and heap size limits.
- Future methods must be static methods and void return types.
- Future methods can’t take standard or custom objects as parameters.
- Most of the time we pass a List or Set of Ids.
- Ensure that future method execute as fast as possible.
- Test that a trigger enqueuing the @future calls is able to handle a trigger collection of 200 records. This helps determine if delays may occur given the design at current and future volumes.
global class FutureClass { @future public static void myFutureMethod() { // Perform some operations } }
global class FutureMethodExample { @future(callout=true) public static void getStockQuotes(String acctName) { // Perform a callout to an external service } }
Code :
FutureApex.cls :
public class FutureApex { @future public static void insertUserWithRole(String uname, String al, String em, String lname) { Profile p = [SELECT Id FROM Profile WHERE Name='Standard User']; UserRole r = [SELECT Id FROM UserRole WHERE Name='COO']; // Create new user with a non-null user role ID User u = new User(alias = al, email=em, emailencodingkey='UTF-8', lastname=lname, languagelocalekey='en_US', localesidkey='en_US', profileid = p.Id, userroleid = r.Id, timezonesidkey='America/Los_Angeles', username=uname); insert u; } }
MixedDMLFuture.cls :
public class MixedDMLFuture { public static void useFutureMethod() { // First DML operation Account a = new Account(Name='Acme', AccountNumber='123333'); insert a; // This next operation (insert a user with a role) // can't be mixed with the previous insert unless // it is within a future method. // Call future method to insert a user with a role. FutureApex.insertUserWithRole('techdicer@techdicer.com', 'techdicer', 'techdicer@techdicer.com', 'techdicer'); } }
MixedDMLFutureTest.cls :
@isTest public class MixedDMLFutureTest { @isTest static void unitTest1() { User thisUser = [SELECT Id FROM User WHERE Id = :UserInfo.getUserId()]; // System.runAs() allows mixed DML operations in test context System.runAs(thisUser) { // startTest/stopTest block to run future method synchronously Test.startTest(); MixedDMLFuture.useFutureMethod(); Test.stopTest(); } // The future method will run after Test.stopTest(); // Verify account is inserted Account[] accts = [SELECT Id from Account WHERE Name='Acme']; System.assertEquals(1, accts.size()); // Verify user is inserted User[] users = [SELECT Id from User where username='mruiz@awcomputing.com']; System.assertEquals(1, users.size()); } }
Reference :
What’s your Reaction?
+1
2
+1
+1
+1
+1
+1
1