LET'S LEARN TOGETHER. THE BEAUTIFUL THING ABOUT LEARNING IS NOBODY CAN TAKE IT AWAY FROM YOU.

All About Asynchronous Apex

While studying for the Salesforce Platform Developer II certification, I was going through the different options Apex provides to run Apex code asynchronously. This post is all about sharing the study notes with key points to remember.

Apex provides four options to run code asynchronously. Future Method, Queueable Apex, Batch Apex and Scheduled Apex.



Future Methods

  • Methods are annotated with @future annotation.
  • Future methods should be static and can only return void type.
  • It supports parameters, but parameters should be primitive data types, arrays of primitive data types, or collection. sObjects or objects cannot be used as parameters to future methods.
  • These methods run in their own thread and will only start when the resources are available.
  • They are used for long running operations and prevent any delay in apex transaction.
  • They can be used for callouts to external web services and also separating DML operations to prevent Mixed DML error.
  • Future methods should not be used for processing large amount of data. In that case, Batch Apex should be used.
  • To test future methods, enclose test code between startTest and stopTest test methods.
  • Future methods not necessarity execute in the same order as they are called.
  • Future methods cannot be used inside Visualforce controllers getter, setter, constructor methods.
Reference
  • Apex code must implement Queueable interace.
  • By implementing Queueable interface, Apex class can be added to the job queue and it will run when the system resources are available.
  • The difference between Queueable Apex and Future methods is -
    • Queueable Apex supports job-chaining
    • It supports non primitive data types likes sObjects or custom objects.
  • System.enqueueJob method is used to submit the job. After submission, ID of AsyncApexJob record is returned.
  • Using SOQL, status of the queued job can be monitored programmatically by querying AsyncApexJob table. The same is also possible from "Apex Jobs"in setup.
  • Chaining is supported here, thus allowing a job to be started from another running job.
  • The execution of a queued job counts once against the shared limit for Asynchronous Apex method executions.
  • Maximum 50 jobs can be added to the queue in a single transaction.
  • Only one child job can exist for each parent job.
  • There is no limit on the dept of the chained jobs.
Reference:
  • Apex class must implement Database.Batchable interface, which will allow them to write code against start, execute and finish methods.
  • A batch class can be invoked by calling Database.executeBatch. It needs the instance of the class and batch size.
  • Using SOQL, status of the batch job can be monitored programmatically by querying AsyncApexJob table. The same is also possible from "Apex Jobs"in setup.
  • It is used to process millions of records asynchronously.
  • Apex jobs always get executed in a separate transaction.
  • Every batch apex transactions has their own governor limit(new limit always). Thus if one batch fails, it will not impact other batches.
  • Start Method:
    • It is used to collect records or objects which will be passed to the method "execute". 
    • It returns either a Database.QueryLocator object or an Iterable.
  • Execute Method:
    • This method is responsible for doing the actual processing work.
    • Default batch size is 200.
    • Parameter it needs - a reference to Database.BatchableContext object and a list of sObjects.
  • Finish Method:
    • This method is used to do post-processing operations likes sending email etc.
Reference:
  • Apex class must implement Schedulable interface. By implementing this interface, an apex class can be scheduled at specific time/day in the Apex Scheduler.
  • System.Schedule method is used to schedule an instance of the class.
  • It should implement the execute method(this is the only method). Parameter - SchedulableContext object.
  • Once a class is scheduled, as CronTrigger object record is created. The getTriggerId method can be used to return the ID of CronTrigger record.
  • If the class is getting scheduled from Trigger, Governor limit should be checked.
  • Additional processing should be done in a separate class outside of execute method.
  • Maximum 100 scheduled Apex jobs at one time is possible.
  • Synchronous Web service callouts are not supported from scheduled apex. To do that, make an asynchronous callout in a method annotated with @future(callout=true) and then call it from scheduled apex. Note - If scheduled apex exceutes batch job, then callouts are possible as they are supported from batch class.
Reference:
Share:

Important points to remember regarding actionRegion, actionFunction, actionSupport, actionPoller


Last night(July 17th, 2019) while preparing for Platform Developer II certification, I was going through my notes to revise the different ways to call Apex Controller functions from Visualforce page, I thought of making a post regarding actionRegion, actionFunction, actionSupport, actionPoller & actionStatus. Just setting the expectation beforehand - It is not a post which will explain you all, but I will share the developer guide link for each of them so that you can go and read them (highly recommended).

actionRegion

The specifies the components to be processed on Force.com server. Without this tag, the whole page will be processed. With actionRegion also the whole form is submitted, but only the part within the tag will be processed.

It needs a reRender attribute to be effective. It will only refresh the part of the page using the data contained within the tag. This can be very effectively used to avoid validation errors that may occur due to present of standard validation rule in VF page like required attribute.

Here is the example without ActionRegion:
Controller:
public with sharing class WithoutActionRegionController {
    public String valueEntered{get;set;}
    public String country{get;set;}
    public String state{get;set;}

    public WithoutActionRegionController() {
        country = '';
        state = '';
        valueEntered = '';
    }

    public PageReference countrySubmitted(){
        valueEntered = 'Country: ' + country;
        return null;
    }
}

Visualforce Page:
<apex:page controller="WithoutActionRegionController">
    <apex:form id="myForm">
        <apex:pageMessages id="messages1"/>
        <apex:pageBlock id="topPageBlock">
            <apex:pageBlockSection columns="2" title="Country & State">
                <apex:outputText value="Enter Country" />
                <apex:inputText value="{!country}" >
                    <apex:actionSupport action="{!countrySubmitted}" reRender="messages1,outputId" event="onchange"/>
                </apex:inputText>
                <apex:outputText value="Enter State" />
                <apex:inputText value="{!state}" required="true"/>
            </apex:pageBlockSection>
            <apex:pageBlockSection title="Output" id="outputId">
                    <apex:outputText value="{!valueEntered}" />
            </apex:pageBlockSection>
        </apex:pageBlock>
    </apex:form>
</apex:page>

Output:

As you can see it throws the validation message due to state field is marked as required=true to moment I finish entering the country. This is because the whole page is submitted to render.

Now the same example with ActionRegion:
<apex:page controller="WithoutActionRegionController">
    <apex:form id="myForm">
        <apex:pageMessages id="messages1"/>
        <apex:pageBlock id="topPageBlock">
            <apex:pageBlockSection columns="2" title="Country & State">
                <apex:outputText value="Enter Country" />
                <apex:actionRegion>
                    <apex:inputText label="Enter Country" value="{!country}" >
                        <apex:actionSupport action="{!countrySubmitted}" reRender="messages1,outputId" event="onchange"/>
                    </apex:inputText>
                </apex:actionRegion>
                <apex:outputText value="Enter State" />
                <apex:inputText value="{!state}" required="true"/>
            </apex:pageBlockSection>
            <apex:pageBlockSection title="Output" id="outputId">
                    <apex:outputText value="{!valueEntered}" />
            </apex:pageBlockSection>
        </apex:pageBlock>
    </apex:form>
</apex:page>

Output:
This time no error message because actionRegion will render the Output and message1 part of the page with the content present inside tag. 

Reference: https://developer.salesforce.com/docs/atlas.en-us.pages.meta/pages/pages_compref_actionRegion.htm?search_text=actionregion

actionFunction

This allows calling controller functions directly from the JavaScript code using AJAX request. It is not the same as actionSupport which only allows calling controller functions from other Visualforce components. Few things to remember -
  • actionFunction is not allowed to be placed inside iteration component. It should be placed after the iteration component.
  • order is matched by the caller's argument list. reRender attribute is needed to define
  • It doesn't have event attribute. It doesn't add Ajax request before calling the Controller method.
Example:
Controller:
public with sharing class ActionFunctionController {
    public Boolean showHelloWorld{get;set;}
    public String message {get;set;}
    public ActionFunctionController(){
        showHelloWorld = false;
        message = '';
    }

    public PageReference shouldDisplayHelloWorld(){
        showHelloWorld = true;
        message = 'Now we can say Hello World';
        
        return null;
    }
}

Visualforce Page:
<apex:page controller="ActionFunctionController">
    <apex:form>
        <apex:actionFunction name="checkHelloWorldDisplay" action="{!shouldDisplayHelloWorld}" reRender="HelloWorldSection"/>
        <apex:pageBlock>
            <apex:pageBlockSection id="HelloWorldSection" columns="1">
                <apex:inputCheckbox value="{!showHelloWorld}" onChange="checkHelloWorldDisplay()"/>
                <apex:outputText value="{!message}" />
            </apex:pageBlockSection>
        </apex:pageBlock>
    </apex:form>

</apex:page>

actionSupport

This can be used when we need the Visualforce component to be refreshed asynchronously by the server when a particular event occurs like button click or mouseover.
  • It adds the AJAX request to the Visualforce Page and then calls the controller function. This is how it different from actionFunction.
  • It also has event attribute. Another difference between actionFunction and actionSupport.
  • It can be placed inside an iteration component.

actionPoller

  • A timer that sends an AJAX request to server according to a time interval specified. Each request can result full or partial refresh of the page.
  • Enabled attribute is used to make poller as active or inactive. Default is active.
  • It won't time out due to inactivity.

Share:

Advanced Currency Management in Salesforce


Salesforce supports multi currency. You can enable the same by going to Company Information and then checking the box - "Activate Multiple Currencies". You need to read the below article before enabling multi currency. https://help.salesforce.com/articleView?id=admin_enable_multicurrency_implications.htm


Once done, you can enable Dated Exchange Rate to define the exchange rate for any kind of periods like month, quarter, year etc. To do that you can go to Company profile -> Manage Currencies

Now you can add the entries for dated exchange rates by clicking on the "Manage Dated Exchange Rates" button. And then click on "New Exchange Rates" button. Below images shows how to add dated exchange rates.

This dated exchange rates are used in Opportunities, Opportunity products and Opportunity Reports.

The object used to store this information is DatedConversionRate. You can run SOQL queries against this object to get the details -

SELECT IsoCode,ConversionRate,NextStartDate,StartDate FROM DatedConversionRate ORDER BY NextStartDate ASC

You can use Rest Explorer also to add/delete new DatedConversionRate like below -
Important Objects/Fields:

  • CurrencyType: This object stores the list of currencies used in the org when multi currency is enabled. If single currency is used in the org, then this object is not available.
  • DatedConversionRate: This object stores the dated exchange rates.
  • CurrencyIsoCode: This additional field is present in object which has current field and the org has multi-currency enabled. 
Share:

Follow Me

Enter your email address:

Delivered by FeedBurner

Popular Posts

Labels

Salesforce (105) Apex (45) admin (27) visualforce (21) ADM (20) dev 501 (19) integration (18) learn salesforce (18) 501 (16) SOAP (13) lightning (12) tutorial (11) Certification. (9) javascript (9) Certification (7) Trigger (7) test class (7) unit testing (7) Advanced Admin (6) Sharing and Visibility (6) design pattern (6) developer (6) report (6) salesforce release (6) security (6) trailhead (6) Advanced Apex (5) Kitchener Developer Group (5) New Features (5) SOQL (5) css (5) dashboard (5) debug (5) formula (5) mobile (5) service cloud (5) solution management (5) use case (5) JSON (4) Lightning Experience (4) Salesforce DX (4) WebSphere (4) best practice (4) cast iron (4) component (4) deployment (4) github (4) html (4) polymer (4) profiles (4) responsive (4) tdd (4) ui (4) Architect (3) Live Chat (3) Online Event (3) Opportunity (3) Performance (3) Products (3) REST (3) Role (3) Sales Cloud (3) Scratch Org (3) Study Notes. (3) Summer15 (3) Tips (3) Web Technology (3) dynamic apex (3) event (3) license (3) map (3) mapbox (3) singleton (3) version controlling (3) Asynchronous callout (2) Bulkify (2) Data Architecture and Management Certification (2) Devops (2) Distributed Version Controlling (2) ES6 (2) Eclipse (2) Einstein (2) Enterprise Territory Management (2) Financial Services Cloud (2) Force.com IDE (2) Governor Limit (2) Groups (2) IBM (2) Implicit Sharing (2) JourneyToCTA (2) Kitchener User Group (2) Lightning Design System (2) Live Agent (2) Metadata (2) PD II (2) Price Book (2) SOSL (2) Sharing (2) Spring 15 (2) Summer17 (2) Territory (2) ant (2) automation tool (2) basic (2) chatter (2) coding (2) communication (2) console (2) controller (2) documentation (2) flow (2) git (2) jquery (2) logging (2) object (2) permission (2) process builder (2) release (2) salesforce1 (2) strategy (2) xml (2) Action Plan (1) Action Plan Template (1) Advanced Currency (1) Agent Productivity (1) Analytics (1) Apex Sharing (1) Arrow (1) Asynchronous Apex (1) Aura Framework (1) Batch (1) Bots (1) Browser (1) Bulk data load (1) CTA (1) Calendar (1) Canon (1) Case Management (1) Celebration (1) Cheat Sheet (1) Classic (1) Community (1) Confetti (1) Constructor (1) Contact Center (1) Continuation (1) Continuous Integration (1) Convert (1) Cookie (1) Custom Metadata (1) Custom Object (1) Customer (1) Dated Exchange Rate (1) Decorator Design Pattern (1) Dev Hub (1) Diwali (1) Email (1) FSC (1) Function (1) Future (1) Goals (1) Guide (1) Household (1) Ideas (1) Improvement (1) KPIs (1) Large Data Volume (1) LastModifiedDate (1) Lightning Web Component (1) Manage Currencies (1) Manual Sharing (1) Metrics (1) Multi Currency (1) New (1) New Feature (1) OOPS (1) OWD (1) Omni-Channel (1) Partner (1) Person Account (1) Photo (1) Pipeline (1) Platform Developer I (1) Platform Developer II (1) Presentation (1) Product Schedule (1) Profile (1) Promise (1) Prototype (1) Public Site (1) Query Plan (1) Queueable (1) QuickReference (1) Reports (1) Retrieve (1) Role Hierarchy (1) SFDX (1) Salesforce Optimizer (1) Schedule (1) Session (1) Sharing Rule (1) Sharing Sets (1) Site (1) Skills (1) Snap-ins (1) Spring 17 (1) Summer14 (1) Summer16 (1) Summer19 (1) Switch (1) SystemModStamp (1) User License (1) Users (1) Webservice (1) Winter'15 (1) Winter'17 (1) access (1) actionFunction (1) actionPoller (1) actionRegion (1) actionSupport (1) agile (1) app (1) approval process (1) aura (1) awesome (1) backup (1) bitbucket (1) book (1) campaign (1) change set (1) code (1) code coverage (1) configuration (1) csv (1) custom button (1) custom settings (1) customization (1) data loader (1) database (1) delegate Admin (1) describe (1) dom (1) dreamforce (1) duplicate (1) dynamic (1) equals (1) error (1) field-level security (1) folder (1) ftp (1) generic (1) gift (1) global describe (1) hashcode (1) import wizard (1) jenkins (1) keynote (1) long running requests (1) monitoring (1) mysql (1) page layout (1) personal (1) power of one (1) record type (1) relationship (1) request (1) review (1) sub-tab (1) tab (1) username (1) visual workflow (1) workflow (1)

Total Subscribers

Total Pageviews