Apex code 在apex中反序列化json响应时获取堆大小错误
我正在使用第三方服务使用RESTAPI获取数据。但有时它会返回超过6MB的数据。他们没有API来提供数据块。我已经在使用future方法将堆大小限制增加到12MB 使用下面的代码,我在数据反序列化时面临堆大小错误。我还强调了我犯错误的地方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
@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);
}
返回请求;
}