Общее количество партий уменьшается, если достигнут предел кучи в пакете Salesforce - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь вычислить точку, в которой достигается предел кучи для пакета с состоянием в 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.

...