Inscreva-se para mudar eventos usando um Acionador do Apex

Objetivos de aprendizagem

Após concluir esta unidade, você estará apto a:

  • Grave um acionador do Apex para se inscrever em eventos de alteração.
  • Gerar notificações de evento de alteração fazendo atualizações no Salesforce.
  • Verificar mensagens de registro de depuração do acionador no registro de depuração.

Você viu como se inscrever em eventos de alteração usando o EMP Connector, uma ferramenta baseada em CometD. Os acionadores do Apex são outra maneira de se inscrever em eventos de alteração. Vamos aprender mais sobre eles.

Acionadores assíncronos do Apex para eventos de modificação

Você pode se inscrever para alterar eventos na plataforma Lightning usando os acionadores do Apex. Os acionadores do Apex para eventos de alteração são semelhantes aos acionadores do Apex para objetos do Salesforce, mas com algumas diferenças. Assim como um acionador do Apex para objetos do Salesforce, você define um acionador de evento de alteração no evento de alteração correspondente ao objeto do Salesforce. Somente acionadores after insert são suportados. 

Definir um acionador de evento de modificação com a palavra-chave após inserir no evento de modificação usando esse formato.

trigger TriggerName on ChangeEventName (after insert) {
}

Veja um exemplo para o objeto AccountChangeEvent, que é o evento de alteração correspondente à Account.

trigger MyAccountChangeTrigger on AccountChangeEvent (after insert) {
}

O acionador do evento de mudança é acionado quando um ou um lote de eventos de mudança é recebido. Ao contrário dos acionadores de objetos, os acionadores de eventos de alteração são executados de forma assíncrona após a conclusão da transação do banco de dados. A execução assíncrona torna os acionadores de eventos de mudança ideais para o processamento de lógica de negócios com uso intensivo de recursos, mantendo a lógica baseada em transação no acionador de objetos. Ao desacoplar o processamento de modificações, os acionadores de eventos de modificação podem ajudar a reduzir o tempo de processamento da transação.

Os acionadores de evento de alteração têm essas características.

  • Eles operam sob a entidade Processo automatizado. Como tal, os registros de depuração para o acionador são criados pela entidade Processo automatizado e campos do sistema, como CreatedById e OwnerId, referência Automated Process.
  • Estão sujeitos aos limites do regulador síncrono Apex.
  • Eles têm um tamanho máximo de lote de 2.000 mensagens de evento (o número de itens em Trigger.New).

Campos de registro de evento e cabeçalho de modificação de Apex

Como os campos em uma mensagem de evento de alteração são estaticamente definidos, assim como em qualquer outro tipo de Apex, todos os campos de registro estão presentes. Ao contrário dos eventos de mudança recebidos em aplicativos CometD externos, as mensagens de evento de alteração do Apex podem conter campos vazios (nulos). Os campos inalterados são nulos e, portanto, são campos explicitamente definidos como nulos em uma atualização. 

Para descobrir quais campos foram modificados, use o campo de cabeçalho changedFields. Ele contém uma lista de campos de registro que foram alterados em uma alteração de atualização. Nesta unidade, o exemplo de acionador mostra como usar o campo changeFields para determinar quais campos foram atualizados ou excluídos.

Nota

Nota

O cabeçalho changedFields está disponível para acionadores do Apex de evento de alteração salvos com a versão de API 47.0 ou superior.

Criar um acionador de eventos de modificação

Adicionar um acionador de eventos de modificação é tão simples quanto adicionar um acionador para um objeto Salesforce. Usando o Console do desenvolvedor, você cria um acionador no evento de modificação associado ao objeto personalizado Employee criado anteriormente. O sistema cria o objeto de evento de mudança, Employee__ChangeEvent, quando você cria um objeto personalizado. 

Nota

Nota

As etapas a seguir exigem que você crie primeiro o objeto personalizado Employee__c. Siga as etapas na unidade anterior para criar este objeto personalizado. 

Para criar um acionador de evento de alteração usando o Console do desenvolvedor:

  1. Clique no menu de acesso rápido ( Menu de acesso rápido).
  2. Para abrir o Console do desenvolvedor:
  3. No Console do desenvolvedor, selecione Arquivo | Novo | Acionador do Apex.
  4. No campo Nome, digite um nome para o acionador: EmployeeChangeTrigger.
  5. Na lista suspensa, selecione o objeto evento de modificação para o objeto personalizado Empregado: Employee__ChangeEvent. O acionador é criado com a palavra-chave após inserir.
  6. Substitua o conteúdo padrão pelo código a seguir.
trigger EmployeeChangeTrigger on Employee__ChangeEvent (after insert) {
  List<Task> tasks = new List<Task>();
  // Iterate through each event message.
  for (Employee__ChangeEvent event : Trigger.New) {
    // Get some event header fields
    EventBus.ChangeEventHeader header = event.ChangeEventHeader;
    System.debug('Received change event for ' +
      header.entityName +
      ' for the ' + header.changeType + ' operation.');
    // For update operations, we can get a list of changed fields
    if (header.changetype == 'UPDATE') {
        System.debug('List of all changed fields:');
        for (String field : header.changedFields) {
            if (null == event.get(field)) {
                System.debug('Deleted field value (set to null): ' + field);
            } else {
                System.debug('Changed field value: ' + field + '. New Value: '
                    + event.get(field));
            }
        }
    }
    // Get record fields and display only if not null.
    System.debug('Some Employee record field values from the change event:');
    if (event.First_Name__c != null) {
      System.debug('First Name: ' + event.First_Name__c);
    }
    if (event.Last_Name__c != null) {
      System.debug('Last Name: ' + event.Last_Name__c);
    }
    if (event.Name != null) {
      System.debug('Name: ' + event.Name);
    }
    if (event.Tenure__c != null) {
      System.debug('Tenure: ' + event.Tenure__c);
    }
    // Create a followup task
    Task tk = new Task();
    tk.Subject = 'Follow up on employee record(s): ' +
    header.recordIds;
    tk.OwnerId = header.CommitUser;
    tasks.add(tk);
  }
  // Insert all tasks in bulk.
  if (tasks.size() > 0) {
    insert tasks;
  }
}

Este evento de mudança aciona iterações através de cada mensagem de evento de mudança recebida em Trigger.New. Para cada evento, o acionador recebe alguns campos de cabeçalho. Se a operação for de atualização, o acionador também obtém a lista de campos que foram alterados acessando o valor do cabeçalho changedFields. Em seguida, o acionador exibe os valores do campo de registro se não forem nulos. Por fim, ele cria uma tarefa subsequente para novos registros de Empregados.

Nota

Nota

A partir da interface do usuário, você pode criar acionadores de eventos de alteração somente a partir do Developer Console. Os objetos de evento de alteração não estão listados no Gerenciador de objetos no Lightning Experience nem na configuração no Salesforce Classic. 

Verificar a execução do acionador do evento de modificação

Agora vamos verificar manualmente se o gatilho está funcionando. Para receber mensagens de eventos no acionador, primeiro habilite o objeto na página Captura de dados de alteração em Configuração. Em uma etapa anterior, você já ativou notificações para Empregado, para que possa ignorar essa etapa aqui. Como os registros de depuração são criados sob a entidade Processo automatizado, ative os logs de depuração em Configuração para esta entidade para que os registros sejam coletados.

  1. Para abrir a Configuração em uma nova guia, clique no menu de acesso rápido ( Menu de acesso rápido) e, em seguida, clique em Configuração.
  2. Em Configuração, digite Registro de depuração na caixa Busca rápida e, em seguida, selecione Registros de depuração.
  3. Clique em Novo.
  4. Em Traced Entity Type (Tipo de entidade rastreada), selecione Automated Process (Processo automatizado).
  5. Selecione o período de tempo para a coleção de registros. As datas de início e expiração usam a data e hora atuais como padrão. Estenda a data de expiração clicando na caixa de inserção de data de término e selecionando o dia seguinte no calendário.
  6. Em nível de depuração, clique em Novo nível de depuração. Insira CustomDebugLevel para o nome, aceite os padrões.
  7. Clique em Salvar.

Deixe a página de Configuração de Registro de depuração, pois você voltará a ela em um minuto. Em seguida, faça algumas modificações no Salesforce para acionar o evento de modificação. Criar um registro de Empregado e, em seguida, atualize-o.

  1. Em uma nova guia, no Iniciador de aplicativos (Iniciador de aplicativos), encontre e selecione Empregados.
  2. Clique em Novo.
  3. Ajuste os campos a seguir.
    • Nome do empregado: e-200
    • Sobrenome: Smith
    • Primeiro nome: Joseph
    • Tenure: 1
  4. Clique em Salvar.
  5. Na página de detalhes do registro de funcionário, clique em Editar.
  6. Mude o campo de nome para Joe.
  7. Exclua o valor para Tenure.
  8. Clique em Salvar.
  9. Alterne para a guia Registros de depuração e atualize o navegador.
  10. Para visualizar os registros de depuração correspondentes à criação do registro, clique em Visualizar ao lado do segundo registro na lista (os registros são ordenados pelo primeiro mais recente). A saída das declarações System.debug é semelhante ao seguinte.
  11. ...|DEBUG|Received change event for Employee__c for the CREATE operation.
    ...|DEBUG|Some Employee record field values from the change event:
    ...|DEBUG|First Name: Joseph
    ...|DEBUG|Last Name: Smith
    ...|DEBUG|Name: e-200
    ...|DEBUG|Tenure: 1.0
  12. Para visualizar os registros de depuração correspondentes à atualização de registros, clique em Visualizar ao lado do primeiro registro na lista. A saída das declarações System.debug é semelhante ao seguinte. Como o sistema atualiza o campo LastModifiedDate quando o registro é atualizado, esse campo é listado como parte dos campos alterados.
  13. ...|DEBUG|Received change event for Employee__c for the UPDATE operation.
    ...|DEBUG|List of all changed fields:
    ...|DEBUG|Changed field value: LastModifiedDate. New Value: 2019-09-26 20:53:29
    ...|DEBUG|Changed field value: First_Name__c. New Value: Joe
    ...|DEBUG|Deleted field value (set to null): Tenure__c
    ...|DEBUG|Some Employee record field values from the change event:
    ...|DEBUG|First Name: Joe

Parabéns! Você escreveu um acionador de evento de alteração e verificou que ele está funcionando corretamente na interface de usuário. Na próxima unidade, você aprenderá a escrever um teste do Apex para o acionador de evento de alteração para automatizar o teste do acionador.

Recursos