O recurso Transaction Finalizers permite anexar ações, usando a interface System.Finalizer, a trabalhos Apex assíncronos que usam a estrutura Queueable. Um caso de uso específico é projetar ações de recuperação quando um trabalho Queueable falha.
Este recurso fornece uma maneira direta para você especificar ações a serem tomadas quando trabalhos assíncronos forem bem-sucedidos ou falharem. Antes dos Finalizadores de Transação, você só podia tomar estas duas ações para falhas de trabalhos assíncronos:
- Pesquise o status do AsyncApexJob usando uma consulta SOQL e enfileire novamente o trabalho se ele falhar
- Dispara BatchApexErrorEvents quando um método Apex em lote encontra uma exceção não tratada
Com finalizadores de transações, você pode anexar uma sequência de pós-ação a um trabalho que pode ser enfileirado e tomar ações relevantes com base no resultado da execução do trabalho.
Um trabalho Queueable que falhou devido a uma exceção não tratada pode ser sucessivamente reenfileirado cinco vezes por um finalizador de transação. Esse limite se aplica a uma série de falhas consecutivas de trabalho Queueable. O contador é zerado quando o trabalho Queueable é concluído sem uma exceção não tratada.
Vamos analisar o exemplo para disparar um alerta por e-mail quando um trabalho que pode ser enfileirado falha.
- Crie uma classe Finalizer e implemente a interface Finalizer.
public class LoggingFinalizer implementa Finalizer {
public void execute ( FinalizerContext ctx ) {
String jobId = ctx. getAsyncApexJobId ();
if (ctx. getResult () != ParentJobResult . SUCCESS ) {
Mensagens . SingleEmailMessage mail = new Mensagens . SingleEmailMessage ();
mail. setToAddresses ( new String [] { 'user@email.com' });
mail. setSubject ( 'Falha no trabalho de desativação de contato: ' + jobId);
mail. setHtmlBody ( 'Detalhes da exceção: ' + ctx. getException (). getMessage ());
Mensagens . sendEmail ( new Mensagens . SingleEmailMessage [] { mail });
}
}
}
2. Crie um QueueableJob e implemente a interface Queueable.
Anexe uma classe Finalizer dentro do método execute. Para anexar o finalizador, invoque o método System.attachFinalizer.
classe pública DeactivateContactQueueableJob implementa Queueable { lista
privada <Id> accountIds;
público ContactQueueableClass (lista <Id> accountIds) {
este . accountIds = accountIds;
}
público vazio execute (contexto QueueableContext) {
LoggingFinalizer f = novo LoggingFinalizer ();
Sistema. anexarFinalizador (f);
Lista <Contato> contatos = [SELECIONE Id, Status__c DE Contato ONDE AccountId EM: accountIds];
para (Contato con: contatos) {
con. Status__c = 'Inativo' ;
}
Banco de dados. atualização (contatos);
}
}
3. Chame o QueueableJob da janela anônima.
System.enqueueJob(novo DeactivateContactQueueableJob(nova Lista<Id>{'ACCOUNT_ID'}));novo DeactivateContactQueueableJob( nova Lista<Id>{ 'ACCOUNT_ID' }));
4. Você receberá um alerta por e-mail se alguma atualização de contato falhar.

Recursos:

