Как исправить System.LimitException: превышен лимит времени процессора Apex, вызванный рабочими процессами с оповещением по электронной почте? - PullRequest
0 голосов
/ 30 июня 2019

Я пытаюсь выполнить метод пакетного тестирования на 100 записях и получить ошибку CPU Runtime Limit.

Я поместил метод Limits.getCpuTime () в свой код и заметил, что мой код без сегмента рабочего процесса занимает3148 мс до завершения.Однако, когда я активирую два рабочих процесса, каждый из которых отправляет электронные письма одному пользователю, я получаю ошибку ограничения времени работы процессора.В целом мой процесс без этих двух рабочих процессов занимает около 10 секунд, а при их активации - около 20 секунд.

    @IsTest
static void returnIncClientAddress(){
    //Select Required Records
    User                                incidentClient      =   [SELECT Id FROM User WHERE Username = 'bbaggins@shire.qa.com' LIMIT 1];
    BMCServiceDesk__Category__c         category            =   [SELECT Id FROM BMCServiceDesk__Category__c WHERE Name = 'TestCategory'];
    BMCServiceDesk__BMC_BaseElement__c  service             =   [SELECT ID FROM BMCServiceDesk__BMC_BaseElement__c WHERE Name = 'TestService'];
    BMCServiceDesk__BMC_BaseElement__c  serviceOffering     =   [SELECT ID FROM BMCServiceDesk__BMC_BaseElement__c WHERE Name = 'TestServiceOffering'];

    //Create Incidents
    List<BMCServiceDesk__Incident__c> incidents = new List<BMCServiceDesk__Incident__c>();
    for(integer i = 0; i < 100; i++){
        BMCServiceDesk__Incident__c incident = new BMCServiceDesk__Incident__c(
            BMCServiceDesk__FKClient__c             =   incidentClient.ID,
            BMCServiceDesk__FKCategory__c           =   category.ID,
            BMCServiceDesk__FKServiceOffering__c    =   serviceOffering.ID,
            BMCServiceDesk__FKBusinessService__c    =   service.ID,
            BMCServiceDesk__FKStatus__c             =   awaiting_for_handling
        );
        incidents.add(incident);
    }
    test.startTest();
    insert incidents;
    test.stopTest();
}

Я ожидал, что рабочие процессы электронной почты и оповещения будут обрабатываться в пакетном режиме и отправляться, не затрачивая слишком много времени на ЦП, но, похоже, Salesforce отнимает много времени как на проверку правил рабочих процессов, так и на их выполнениепри необходимости.Кажется, что большая часть времени процесса тратится на отправку электронных писем рабочих процессов (чего на самом деле нет, потому что это тестовый метод).

Ответы [ 2 ]

0 голосов
/ 02 июля 2019

Есть ли триггеры на BMCServiceDesk__Incident__c или на объектах, измененных рабочим процессом? Триггеры на обновлениях могут привести к многократному выполнению кода в одном и том же контексте выполнения, что приведет к достижению лимита ЦП. Рассмотрите возможность повторного входа в триггеры или выполните проверку, чтобы запускать триггеры только при соблюдении определенных критериев. В противном случае рассмотрите возможность рефакторинга кода, если это возможно, чтобы работа выполнялась в одном и том же цикле, если это возможно, поскольку циклы, особенно вложенные циклы, увеличивают использование вашего процессора. Обычно рабочий процесс сам по себе не увеличивает лимит ЦП, если триггеры не выполняются из-за обновлений рабочего процесса.

0 голосов
/ 30 июня 2019

Вы мало что можете сделать, чтобы контролировать время выполнения правил рабочего процесса.Вы можете попробовать преобразовать их в Apex и провести сравнительный анализ, чтобы увидеть, приведет ли это к улучшению потребляемого времени, но я подозреваю, что реальное решение заключается в том, что вам придется отключить массовый тест.

Ограничение ЦП для транзакции составляет 10 секунд.Если ваш код модульного теста уже занимает около 10 секунд, чтобы завершиться без рабочих процессов (я не уверен точно, на что ссылаются ваши 3148 мс и 10 с), у вас действительно есть только два варианта:

  • Увеличьте общую сумму автоматизации, выполняемой при вставке этого объекта;
  • Сократите количество данных, которые вы обрабатываете в этом модульном тесте.

Непонятно, что вына самом деле тестируем здесь, но если это триггер Apex, вы должны убедиться, что он правильно масштабирован и не потребляет ненужного процессорного времени, в том числе через рекурсию триггера.Просмотр стека вызовов в ваших журналах (или просто добавление операторов System.debug()) может помочь в этом.

И наконец - убедитесь, что вы пишете утверждения в своем методе тестирования.Методы испытаний без утверждений близки к бесполезным.

...