Apex code 在apex中反序列化json响应时获取堆大小错误

Apex code 在apex中反序列化json响应时获取堆大小错误,apex-code,apex,Apex Code,Apex,我正在使用第三方服务使用RESTAPI获取数据。但有时它会返回超过6MB的数据。他们没有API来提供数据块。我已经在使用future方法将堆大小限制增加到12MB 使用下面的代码,我在数据反序列化时面临堆大小错误。我还强调了我犯错误的地方 @future (callout=true) public static void CreateProjects(set<ID> setOfProjectID) { HttpRequest request; HttpResponse

我正在使用第三方服务使用RESTAPI获取数据。但有时它会返回超过6MB的数据。他们没有API来提供数据块。我已经在使用future方法将堆大小限制增加到12MB

使用下面的代码,我在数据反序列化时面临堆大小错误。我还强调了我犯错误的地方

@future (callout=true)
public static void CreateProjects(set<ID> setOfProjectID)
{
    HttpRequest request;
    HttpResponse response = new HttpResponse();
    Map<Id,Opportunity> mapOfIdAndProjectToCreate = new Map<Id,Opportunity>([SELECT Id, Name, projectId__c FROM Opportunity 
                                                    WHERE ID IN :setOfProjectID]);
    Integer customerId;
    List<Opportunity> lstOppToUpdate = new List<Opportunity>();
    if(!mapOfIdAndProjectToCreate.isEmpty())
    {
        for(Id OpportunityID : mapOfIdAndProjectToCreate.keySet())
        {
            Opportunity oppCreated = new Opportunity();
            oppCreated = mapOfIdAndProjectToCreate.get(OpportunityID);
            try
            {
                String projectId;
                String requestBody = createRequestBodyForProject(mapOfIdAndProjectToCreate.get(OpportunityID));
                HttpRequest req = CreateHttpRequest(ConstantCls.CreateProjectURL,requestBody,'POST');
                Http http = new Http();
                HTTPResponse resp = new HTTPResponse();
                if(!Test.IsRunningTest())
                {
                    resp = http.send(req);
                    System.debug('heap size after api call '+Limits.getHeapSize());
                }
                if(resp.getStatusCode() == 200)
                {
                    System.debug('heap size before deserializtion '+Limits.getHeapSize());
// Till now we have 6 MB data in HTTPResponse resp variable, but when we go for deserializing by fetching its body, it gives Heap size limit error. 
// It is giving error when we try to fetch its body, because it has already size of response of 6 MB + little bytes are occupied by others variable. and when we fetch its body, it exceeds to more than 12 MB.
// In execution of below line, I am getting Heap size limit error.
                    *Map<String, Object> mapKeyVal = (Map<String, Object>)System.JSON.deserializeUntyped(resp.getBody());*
System.debug('heap size after deserialization '+Limits.getHeapSize());
                    Map<String, Object> data = (Map<String, Object>)mapKeyVal.get('data');
                    projectId = String.valueOf(data.get('projectId'));
                    oppCreated.projectId__c = projectId;
                    lstOppToUpdate.add(oppCreated);
                }
            }
            Catch(Exception ex)
            {
                System.debug('Error In Sync - CreateProjects method Updated - '+ ex.getMessage() + ex.getStackTraceString());              
            }
        }
    }
    UPDATE lstOppToUpdate;
}
public static HttpRequest CreateHttpRequest(String apiUrl, String requestBody, String method)
{
    Map<String,String> apiConfigs = GetAllConfigSettings();   
    HttpRequest req = new HttpRequest();
    req.setEndpoint(apiUrl);
    req.setMethod(method);  
    req.setTimeout(120000);
    req.setHeader('Content-Type', 'application/json');  
    req.setHeader('Authorization', apiConfigs.get('Access Token'));  
    if(String.isNotEmpty(requestBody))
    {
        req.setBody(requestBody);    
    }
    return req;
}
@future(callout=true)
公共静态void CreateProjects(项目集)
{
HttpRequest请求;
HttpResponse response=新的HttpResponse();
Map mapOfIdAndProjectToCreate=新建地图([从Opportunity中选择Id、名称、Projectd\uu\c
其中ID位于:setOfProjectID]);
整数客户ID;
List lstoptoupdate=新列表();
如果(!mapOfIdAndProjectToCreate.isEmpty())
{
对于(Id OpportunityID:mapOfIdAndProjectToCreate.keySet())
{
Opportunity oppCreated=新Opportunity();
oppCreated=mapOfIdAndProjectToCreate.get(OpportunityID);
尝试
{
弦投影;
String requestBody=createRequestBodyForProject(mapOfIdAndProjectToCreate.get(OpportunityID));
HttpRequest req=CreateHttpRequest(ConstantCls.CreateProjectURL,requestBody,'POST');
Http=newhttp();
HTTPResponse resp=新的HTTPResponse();
如果(!Test.IsRunningTest())
{
resp=http.send(req);
debug('api调用后的堆大小'+Limits.getHeapSize());
}
如果(分别为getStatusCode()==200)
{
debug('反序列化之前的堆大小'+Limits.getHeapSize());
//到目前为止,我们在HTTPResponse resp变量中有6MB的数据,但当我们通过获取其主体进行反序列化时,它给出了堆大小限制错误。
//当我们试图获取它的主体时,它给出了错误,因为它已经有6MB的响应大小+其他变量占用了一些字节。当我们获取它的主体时,它超过了12MB。
//在执行下行时,我得到堆大小限制错误。
*Map mapKeyVal=(Map)System.JSON.deserializeUntyped(resp.getBody())*
debug('反序列化后的堆大小'+Limits.getHeapSize());
Map data=(Map)mapKeyVal.get('data');
projectId=String.valueOf(data.get('projectId');
oppCreated.projectd_uuuc=projectd;
lstoptoupdate.add(oppCreated);
}
}
捕获(例外情况除外)
{
debug('Sync中的错误-CreateProjects方法更新-'+ex.getMessage()+ex.getStackTraceString());
}
}
}
更新lstoptoupdate;
}
公共静态HttpRequest CreateHttpRequest(字符串APIRL、字符串请求体、字符串方法)
{
Map apiConfigs=GetAllConfigSettings();
HttpRequest req=新的HttpRequest();
请求setEndpoint(apirl);
要求设置方法(方法);
请求设置超时(120000);
req.setHeader('Content-Type','application/json');
请求setHeader('Authorization',apiConfigs.get('Access Token');
if(String.isNotEmpty(requestBody))
{
请求主体(requestBody);
}
返回请求;
}