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ê já viu como assinar eventos de alteração usando a API Pub/Sub. 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. As mensagens de eventos 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.
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.
Para criar um acionador de evento de alteração usando o Console do desenvolvedor:
- Clique no menu de acesso rápido ().
- Para abrir o Console do desenvolvedor:
- No Console do desenvolvedor, selecione Arquivo | Novo | Acionador do Apex.
- No campo Nome, digite um nome para o acionador:
EmployeeChangeTrigger
.
- Na lista suspensa, selecione o objeto evento de modificação para o objeto personalizado Empregado: Employee__ChangeEvent. O acionador é criado com a palavra-chave
after insert
(após inserir).
- 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.
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.
- Para abrir a Setup (Configuração) em uma nova guia, clique no menu de acesso rápido () e, em seguida, clique em Setup (Configuração).
- Em Setup (Configuração), digite
Debug Logs
(Registros de depuração) na caixa Busca rápida e, em seguida, selecione Debug Logs (Registros de depuração).
- Clique em Novo.
- Em Traced Entity Type (Tipo de entidade rastreada), selecione Automated Process (Processo automatizado).
- 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.
- Em nível de depuração, clique em Novo nível de depuração. Insira
CustomDebugLevel
para o nome, aceite os padrões.
- 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.
- Em uma nova guia, no App Launcher (Iniciador de aplicativos) (), encontre e selecione Employees (Funcionários).
- Clique em Novo.
- Ajuste os campos a seguir.
- Employee name (Nome do funcionário):
e-200
- Last Name (Sobrenome):
Smith
- First Name (Nome):
Joseph
- Tenure (Tempo no cargo):
1
- Clique em Salvar.
- Na página de detalhes do registro de funcionário, clique em Editar.
- Mude o campo First Name (Nome) para
Joe
.
- Exclua o valor para Tenure.
- Clique em Salvar.
- Alterne para a guia Registros de depuração e atualize o navegador.
- 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.
...|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
- 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.
...|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
-
Desenvolvedores do Salesforce: Guia do desenvolvedor do Change Data Capture: Inscrever-se com acionadores do Apex
-
Desenvolvedores do Salesforce: Apex Developer Guide