Я пытаюсь вычислить точку, в которой достигается предел кучи для пакета с состоянием в Salesforce. Для этого я веду список и карту. Но после определенного момента, если предел кучи достигнут, общее количество партий уменьшается, и партия помечается как завершенная. Я не могу определить, является ли это желаемое поведение Salesforce для обработки таких условий или это ошибка Salesforce.
Фрагмент кода:
public class TestBatch implements Database.Batchable<SObject>, Database.Stateful, Database.AllowsCallouts
{
private List<Id> ids;
private Map<List<String>, List<SObject>> groups;
private Integer iterationNumber;
private final String PRIORITY_HIGH = 'High';
public TestBatch(Integer iterationNumber)
{
ids = new List<Id>();
groups = new Map<List<String>, List<SObject>>();
this.iterationNumber = iterationNumber;
}
private String getHeapSize(String suffix)
{
return suffix + ': Heap size is "' + limits.getHeapSize() + '" out of "' + limits.getLimitHeapSize() + '"';
}
public Database.QueryLocator start(Database.BatchableContext bc)
{
Task reviewTask = new Task();
// Task details
reviewTask.Subject = getHeapSize('@Start') + ' | Number of Ids and groups: ' + ids.size() + ' & ' + groups.size();
reviewTask.Description = getHeapSize('@Start') + ' | Number of Ids and groups: ' + ids.size() + ' & ' + groups.size();
reviewTask.Priority = PRIORITY_HIGH;
reviewTask.ActivityDate = System.today();
reviewTask.ReminderDateTime = System.now();
reviewTask.IsReminderSet = true;
insert reviewTask;
delete [select id from testObject__c];
List<testObject__c> toList = [select Id from testObject__c];
if(balancesList.size()<this.iterationNumber)
{
for (integer i = 0; i <this.iterationNumber; i++)
{
testObject__c to = new testObject__c(Name='abc'+i);
toList.add(to);
}
insert toList;
}
return Database.getQueryLocator([SELECT Id FROM testObject__c LIMIT :this.iterationNumber]);
}
public void execute(Database.BatchableContext BC, List<SObject> scope)
{
List<testObject__c> results = (List<testObject__c>) scope;
for(Integer i=0; i<100000; i++)
{
ids.add(results[0].Id);
groups.put(new List<String>{results[0].Id + String.valueOf(i)}, results);
}
}
public void finish(Database.BatchableContext BC)
{
Task reviewTask = new Task();
// Task details
reviewTask.Subject = getHeapSize('@Finish') + ' | Number of Ids and groups: ' + ids.size() + ' & ' + groups.size();
reviewTask.Description = getHeapSize('@Finish') + ' | Number of Ids and groups: ' + ids.size() + ' & ' + groups.size();
reviewTask.Priority = PRIORITY_HIGH;
reviewTask.ActivityDate = System.today();
reviewTask.ReminderDateTime = System.now();
reviewTask.IsReminderSet = true;
insert reviewTask;
}
}
для запуска выше пакета:
Database.executeBatch(new TestBatch(3), 1);
при каждом выполнении 100000 значений добавляются в список и на карту. В 3-м исполнении достигается предел кучи, и общее количество партий уменьшается с 3 до 2.