function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
bappabappa 

System.LimitException: Apex CPU time limit exceeded

Hi All,

 

I am getting 'System.LimitException: Apex CPU time limit exceeded' error while reading and parsing XML as web service response.Debug log jhas reached its maximum size.

 

Below is my class:

 

public class readXMLResponseAndMapXMLDom{

 

public List<SiteSolutionProperty> getMap(){

Http http = new Http();
HttpRequest req = new HttpRequest();
req.setEndpoint('URL'); // did not include the actual URL; conncetion is successful.
req.setMethod('GET');
HttpResponse res = http.send(req);
List<XmlDom.Element> result1 = new List<XmlDom.Element>();
List<SiteSolutionProperty> result2 = new List<SiteSolutionProperty>();
SiteSolutionProperty ssp;
List<SiteSolutionPropertyDetails> finalResult = new List<SiteSolutionPropertyDetails>();
Integer counter = 0;
// create the xml doc that will contain the results of the REST operation

/********* USING XMLDOM ******/
XmlDom doc = new XmlDom(res.getBody());
// process the results
//System.debug('Total Collection size ---'+doc.getElementsByTagName('ClassBrokerAvailabilities').size());
system.debug('Limits.getHeapSize()'+Limits.getHeapSize());
for (XmlDom.Element element: doc.getElementsByTagName('ClassBrokerAvailabilities')){
ssp = new SiteSolutionProperty();
//element.textContent()
if(element.getElementsByTagName('BuildingKey') !=null){
//System.out.println("IF child name "+element.getElementsByTagName("BuildingKey").item(0).getTextContent());
ssp.setBuildingKey(element.getElementsByTagName('BuildingKey').get(0).textContent());
}
if(element.getElementsByTagName('AddressLine2') !=null){
ssp.setAddressLine2(element.getElementsByTagName('AddressLine2').get(0).textContent());
}
if(element.getElementsByTagName('BuildingName') !=null){
ssp.setBuildingName(element.getElementsByTagName('BuildingName').get(0).textContent());
}
/*if(element.getElementsByTagName('BuildingOwner') !=null){
ssp.setBuildingOwner(element.getElementsByTagName('BuildingOwner').get(0).textContent());
}*/

/*if(element.getElementsByTagName('BuildingStatus') !=null){
ssp.setBuildingStatus(element.getElementsByTagName('BuildingStatus').get(0).textContent());
}*/
if(element.getElementsByTagName('City_State') !=null){
ssp.setCity_State(element.getElementsByTagName('City_State').get(0).textContent());
}
/*if(element.getElementsByTagName('DateBuilt') !=null){
ssp.setDateBuilt(element.getElementsByTagName('DateBuilt').get(0).textContent());
}*/
/*if(element.getElementsByTagName('ForSale') !=null){
ssp.setForSale(element.getElementsByTagName('ForSale').get(0).textContent());
}*/
if(element.getElementsByTagName('LeasingAgent') !=null){
ssp.setLeasingAgent(element.getElementsByTagName('LeasingAgent').get(0).textContent());
}
if(element.getElementsByTagName('MarketName') !=null){
ssp.setMarketName(element.getElementsByTagName('MarketName').get(0).textContent());
}
/*if(element.getElementsByTagName('PropertyClass') !=null){
ssp.setPropertyClass(element.getElementsByTagName('PropertyClass').get(0).textContent());
}*/
if(element.getElementsByTagName('Recordnumber') !=null){
ssp.setRecordnumber(element.getElementsByTagName('Recordnumber').get(0).textContent());
}
if(element.getElementsByTagName('Rent') !=null){
ssp.setRent(element.getElementsByTagName('Rent').get(0).textContent());
}
if(element.getElementsByTagName('Rentable') !=null){
ssp.setRentable(element.getElementsByTagName('Rentable').get(0).textContent());
}
/*if(element.getElementsByTagName('SubMarket') !=null){
ssp.setSubMarket(element.getElementsByTagName('SubMarket').get(0).textContent());
}*/
/*if(element.getElementsByTagName('Vacant') !=null){
ssp.setVacant(element.getElementsByTagName('Vacant').get(0).textContent());
}*/
result2.add(ssp);

}

return result2;
}


}

 

and the Vf page is below:

 

<apex:page controller="readXMLResponseAndMapXMLDom" standardStylesheets="false" sidebar="false">
     <apex:form >
          <apex:pageBlock >
           <!-- section for button Add Property -->
               <apex:pageBlockButtons > 
                   <apex:commandButton value="Add Selected Property" action="{!propertySelected}" rerender="table"/> 
               </apex:pageBlockButtons>    
              <apex:pageBlockTable value="{!MAP}" var="propdetails" id="table">
                  <apex:column >
                      <!-- This is our select checkbox to select Properties data -->
                      <apex:inputCheckbox value="{!propdetails.selected}"/>
                  </apex:column>
                  <!-- Site Property Solution Details --> 
                  <!-- <apex:column headerValue="Recordnumber"  value="{!propdetails.Recordnumber}" /> -->
                  <apex:column headerValue="BuildingKey"  value="{!propdetails.BuildingKey}" />                  
                 <!--  <apex:column headerValue="BuildingName"  value="{!propdetails.BuildingName}" />
                  <apex:column headerValue="AddressLine2"  value="{!propdetails.AddressLine2}" />
                  <apex:column headerValue="City_State"  value="{!propdetails.City_State}" />
                  <apex:column headerValue="MarketName"  value="{!propdetails.MarketName}" />
                  <apex:column headerValue="Rentable"  value="{!propdetails.Rentable}" />
                  <apex:column headerValue="Vacant"  value="{!propdetails.Vacant}" /> 
                  <apex:column headerValue="PropertyClass"  value="{!propdetails.PropertyClass}" />
                  <apex:column headerValue="Rent"  value="{!propdetails.Rent}" />                  
                  <apex:column headerValue="LeasingAgent"  value="{!propdetails.LeasingAgent}" />
                  <apex:column headerValue="SubMarket"  value="{!propdetails.SubMarket}" />
                  <apex:column headerValue="BuildingType"  value="{!propdetails.BuildingType}" />
                  <apex:column headerValue="BuildingStatus"  value="{!propdetails.BuildingStatus}" />
                  <apex:column headerValue="DateBuilt"  value="{!propdetails.DateBuilt}" />
                  <apex:column headerValue="ForSale"  value="{!propdetails.ForSale}" />
                  <apex:column headerValue="BuildingOwner"  value="{!propdetails.BuildingOwner}" /> -->                      
    
              </apex:pageBlockTable>
          </apex:pageBlock>
          <apex:panelGrid columns="4">
              <apex:commandLink action="{!first}">First</apex:commandlink>
              <apex:commandLink action="{!previous}" rendered="{!hasPrevious}">Previous</apex:commandlink>
              <apex:commandLink action="{!next}" rendered="{!hasNext}">Next</apex:commandlink>
              <apex:commandLink action="{!last}">Last</apex:commandlink>
          </apex:panelGrid>
      </apex:form>
  </apex:page>




Matt ThomasMatt Thomas

Hi,

 

I think that if you provide a sample of your XML schema and also your SiteSolutionProperty class it may help to understand the entire picture better. It looks like you're hitting the statement limit for Apex. The doc.getElementsByTagName('ClassBrokerAvailabilities') list that you're iterating over in that for loop, which then invokes all of those 'set' methods in your ssp controller looks like it could add up the amount of statements executed per list item really quickly.

 

-What is the purpose of having those set methods for every property of SiteSolutionProperty? I can't tell because I can't see the logic within them, but judging by the name it looks like they simply set the property. Depending on what those methods are doing, removing them could cut down on the amount of statements executed.

 

-The amount of times that you're invoking getElementsByTagName has to be contributing to the limit exception due to the sheer amount of unnecessary lists you're then also iterating over within the actual for loop itself.. See below for an alternative method for parsing the XML response.

 

-Using 'else if' in your if block may also help to cut down on line executions. As it is currently, for every list element that you iterate it will do every single check. For example, if the first list element that your code comes across is AddressLine2, it will hit that and set AddressLine2 in ssp; after that, it will check every other tag scenario even though we already know that it doesn't need to.

 

Try to refactor your code as such: I'll give you a high level and generic example, and let me know if you have any questions applying it to your code.

 

public static void parseYourXML(HttpResponse res) {
        SiteSolutionProperty ssp = new SiteSolutionProperty();
        DOM.Document document = new DOM.Document();
        document.load(res.getBody());
        
        DOM.Xmlnode xmlRootNode = document.getRootElement();
        for (DOM.Xmlnode child : xmlRootNode.getChildren()) {
            if (child.getName() == 'Name')
                ssp.Name = child.getText();
            else if (child.getName() == 'Different Name')
                ssp.DifferentName = child.getText();
        }

}

Bhagyashree Shinde 8Bhagyashree Shinde 8
Hi Bappa,
I am getting same error as you get I also used wrapper class and use its instance to set Like you use ssp. I used QC.How you solved this error ?
Reply as soon as possible.