quarta-feira, fevereiro 11, 2026
HomeSalesforce DXApexSalesforce Apex: finalizadores de transações

Salesforce Apex: finalizadores de transações

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.

  1. 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:

  1. https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_transaction_finalizers.htm

 

RELATED ARTICLES

Mais acessados