Если я ставлю в очередь экземпляр класса Queueable во время триггера «до», гарантируется ли, что класс Queueable не будет работать до тех пор, пока не завершится триггер «после»?

4
Bo Laurent 21 Фев 2020 в 21:28
Quueable является асинхронным. Он будет запускаться всякий раз, когда Salesforce решит, что для него достаточно ресурсов. Вопрос к вам: почему бы не вызвать его в контексте after?
 – 
Drew Kennedy
21 Фев 2020 в 21:34
У меня есть триггерная структура; чтобы вызвать его в контексте после, мне нужно создать класс AccountAfterTriggerHandler. Я ленивый. Но я думаю, что все равно сделаю это в контексте после, потому что выполнение в контексте до, вероятно, запутает будущих сопровождающих.
 – 
Bo Laurent
21 Фев 2020 в 21:46

1 ответ

Лучший ответ

Да, это гарантировано (хотя явно не задокументировано). Причина в том, что до тех пор, пока транзакция не будет полностью зафиксирована, вызов задания Queueable может быть отменен из-за ограничений регулятора, вызова sObject addError, команды Database.rollback или неперехваченного исключения. и, вероятно, несколько других способов. Таким образом, система абсолютно не будет выполнять Queueable до тех пор, пока транзакция, породившая контекст триггера, не завершится успешно. Это также относится к запланированным заданиям, пакетным заданиям, будущим методам, отправке электронных писем, вычислению общих строк и почти любому другому типу асинхронного кода или действия, которые могут существовать в будущем. Двумя исключениями из этой гарантии являются действия «DML Immediate», доступные для внешних объектов, и действия EventBus.publish, которые можно вызывать для событий платформы, которые выполняются немедленно.

(Примечание для будущих читателей: если в будущем возникнут исключения из этой гарантии, сообщите мне об этом.)

9
sfdcfox 21 Фев 2020 в 21:44