Abonnieren von Änderungsereignissen mithilfe eines Apex-Auslösers
Lernziele
Nachdem Sie diese Lektion abgeschlossen haben, sind Sie in der Lage, die folgenden Aufgaben auszuführen:
- Schreiben eines Apex-Auslösers zum Abonnieren von Änderungsereignissen
- Erzeugen von Änderungsereignisbenachrichtigungen durch Vornehmen von Änderungen in Salesforce
- Überprüfen Sie Debug-Protokollmeldungen zum Auslöser im Debug-Protokoll.
Sie wissen jetzt, wie Sie Änderungsereignisse mit der Pub/Sub-API anbonnieren. Apex-Auslöser sind eine weitere Möglichkeit zum Abonnieren von Änderungsereignissen. Lassen Sie uns mehr darüber in Erfahrung bringen.
Asynchrone Apex-Auslöser für Änderungsereignisse
Sie können auf der Lightning-Plattform mithilfe von Apex-Auslösern Änderungsereignisse abonnieren. Apex-Auslöser für Änderungsereignisse ähneln Apex-Auslösern für Salesforce-Objekte, weisen jedoch einige Unterschiede auf. Wie ein Apex-Auslöser für Salesforce-Objekte definieren Sie einen Änderungsereignisauslöser für das dem Salesforce-Objekt entsprechende Änderungsereignis. Nur "after insert"-Auslöser werden unterstützt:
Definieren Sie einen Änderungsereignisauslöser mit dem Schlüsselwort after insert
für das Änderungsereignis im folgenden Format.
trigger TriggerName on ChangeEventName (after insert) { }
Hier ist ein Beispiel für das AccountChangeEvent-Objekt, das "Account" entsprechende Änderungsereignis.
trigger MyAccountChangeTrigger on AccountChangeEvent (after insert) { }
Der Änderungsereignisauslöser wird aktiviert, wenn ein einzelnes bzw. ein Batch von Änderungsereignissen empfangen wird. Im Gegensatz zu Objektauslösern werden Änderungsereignisauslöser nach Abschluss der Datenbanktransaktion asynchron ausgeführt. Durch die asynchrone Ausführung eignen sich Änderungsereignisse ideal für die Verarbeitung ressourcenintensiver Geschäftslogik unter Beibehaltung der transaktionsbasierten Logik im Objektauslöser. Durch das Entkoppeln der Verarbeitung von Änderungen können Änderungsereignisauslöser dazu beitragen, die Transaktionsverarbeitungszeit zu verkürzen.
Änderungsereignisauslöser haben diese Merkmale.
- Sie werden unter der Einheit "Automatisierter Prozess" ausgeführt. Daher werden Debug-Protokolle für den Auslöser von der Einheit "Automatisierter Prozess" erstellt, und Systemfelder wie CreatedById und OwnerId verweisen auf "Automatisierter Prozess".
- Sie unterliegen den synchronen Obergrenzen von Apex.
- Sie haben eine maximale Batchgröße von 2.000 Ereignisnachrichten (die Anzahl der Elemente in
Trigger.New
).
Datensatz- und Header-Felder von Apex-Änderungsereignissen
Da Felder in einer Änderungsereignisnachricht statisch definiert sind, sind wie bei jedem anderen Apex-Typ alle Datensatzfelder vorhanden. Apex-Änderungsereignisnachrichten können leere Felder (NULL) enthalten. Unveränderte Felder sind NULL, ebenso wie Felder, die bei einer Aktualisierung explizit auf NULL festgelegt werden.
Um herauszufinden, welche Felder geändert wurden, verwenden Sie das Header-Feld changedFields
. Sie enthält eine Liste der Datensatzfelder, die bei einem Aktualisierungsvorgang geändert wurden. Der Beispielauslöser in dieser Einheit zeigt, wie mithilfe des Felds changedFields bestimmt werden kann, welche Felder aktualisiert oder gelöscht wurden.
Erstellen eines Änderungsereignisauslösers
Das Hinzufügen eines Änderungsereignisauslösers erfolgt genauso einfach wie das Hinzufügen eines Auslösers für ein Salesforce-Objekt. Sie erstellen in der Developer Console einen Auslöser für das Änderungsereignis, das dem benutzerdefinierten Objekt "Employee" zugeordnet ist, das Sie zuvor erstellt haben. Das System erstellt das Änderungsereignisobjekt Employee__ChangeEvent, wenn Sie ein benutzerdefiniertes Objekt anlegen.
So erstellen Sie den Änderungsereignisauslöser in der Developer Console:
- Klicken Sie auf das Schnellzugriffsmenü ().
- Klicken Sie auf Developer Console.
- Wählen Sie in der Developer Console File | New | Apex Trigger aus.
- Geben Sie in das Feld "Name" einen Namen für den Auslöser ein:
EmployeeChangeTrigger
.
- Wählen Sie in der Dropdown-Liste das Änderungsereignisobjekt für das benutzerdefinierte Objekt "Employee" aus: Employee__ChangeEvent. Der Auslöser wird mit dem Schlüsselwort
after insert
erstellt.
- Ersetzen Sie den Standardinhalt durch den folgenden Code.
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; } }
Dieser Änderungsereignisauslöser iteriert durch jede empfangene Änderungsereignisnachricht in Trigger.New
. Für jedes Ereignis erhält der Auslöser einige Header-Felder. Wenn der Vorgang eine Aktualisierung ist, ruft der Auslöser auch durch Zugriff auf den Header-Wert changedFields
die Liste der Felder ab, die geändert wurden. Als Nächstes zeigt der Auslöser Werte von Datensatzfeldern an, falls diese nicht NULL sind. Schließlich erstellt er eine Folgeaufgabe für neue Datensätze des Typs "Employee".
Überprüfen der Ausführung von Änderungsereignisauslösern
Lassen Sie uns nun manuell überprüfen, ob der Auslöser funktioniert. Um Ereignisnachrichten im Auslöser zu empfangen, aktivieren Sie das Objekt zurest auf der Seite "Datenänderungserfassung" in Setup. In einem früheren Schritt haben Sie bereits Benachrichtigungen für "Employee" aktiviert, sodass Sie diesen Schritt hier überspringen können. Da Debug-Protokolle unter der Einheit "Automatisierter Prozess" erstellt werden, aktivieren Sie Debug-Protokolle in Setup für diese Entität, damit Protokolle gesammelt werden können.
- Um Setup in einer neuen Registerkarte zu öffnen, klicken Sie auf das Schnellzugriffsmenü () und anschließend auf Setup.
- Geben Sie unter "Setup" im Feld "Schnellsuche" den Text
Debug-Protokolle
ein und wählen Sie dann Debug-Protokolle aus.
- Klicken Sie auf Neu.
- Wählen Sie Automatisierter Prozess für "Typ der verfolgten Einheit" aus.
- Wählen Sie den Zeitraum für die Protokollerfassung aus. Das Start- und Ablaufdatum entspricht standardmäßig dem aktuellen Datum und der aktuellen Uhrzeit. Verlängern Sie das Ablaufdatum, indem Sie auf das Eingabefeld für das Enddatum klicken und den nächsten Tag im Kalender auswählen.
- Klicken Sie für "Debugebene" auf Neue Debugebene. Geben Sie
CustomDebugLevel
als Name ein und übernehmen Sie die Standardeinstellungen.
- Klicken Sie auf Save (Speichern).
Lassen Sie die Setup-Seite "Debug-Protokolle" geöffnet, da Sie in Kürze zu ihr zurückkehren. Nehmen Sie als Nächstes einige Änderungen in Salesforce vor, um den Änderungsereignisauslöser zu aktivieren. Erstellen Sie einen "Employee"-Datensatz und aktualisieren Sie ihn.
- Klicken Sie auf einer neuen Registerkarte auf den App Launcher () und dann auf Employees.
- Klicken Sie auf Neu.
- Füllen Sie die folgenden Felder aus.
- Employee Name (Mitarbeitername):
e-200
- Last Name (Nachname):
Smith
- First Name (Vorname):
Joseph
- Tenure (Anstellungsdauer):
1
- Klicken Sie auf Speichern.
- Klicken Sie auf der Detailseite des "Employee"-Datensatzes auf Bearbeiten.
- Ändern Sie das Feld "First Name" in
Joe
.
- Löschen Sie den Wert für "Tenure".
- Klicken Sie auf Speichern.
- Wechseln Sie zur Registerkarte "Debug-Protokolle" und aktualisieren Sie den Browser.
- Um die Debug-Protokolle anzuzeigen, die der Datensatzerstellung entsprechen, klicken Sie in der Liste neben dem zweiten Protokoll auf Anzeigen (das neueste Protokoll befindet sich in der Sortierung ganz oben). Die Ausgabe der
System.debug
-Anweisungen sieht in etwa so aus.
...|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
- Um die Debug-Protokolle anzuzeigen, die der Datensatzaktualisierung entsprechen, klicken Sie in der Liste neben dem ersten Protokoll auf "Anzeigen". Die Ausgabe der
System.debug
-Anweisungen sieht in etwa so aus. Da das System das Feld LastModifiedDate beim Aktualisieren des Datensatzes aktualisiert, ist dieses Feld als Teil der geänderten Felder aufgeführt.
...|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
Glückwunsch! Sie haben einen Änderungsereignisauslöser geschrieben und überprüft, ob er auf der Benutzeroberfläche einwandfrei funktioniert. In der nächsten Lektion erfahren Sie, wie Sie einen Apex-Test für den Änderungsereignisauslöser schreiben, um das Testen Ihres Auslösers zu automatisieren.
Ressourcen
-
Salesforce Developers: Change Data Capture Developer Guide: Subscribe with Apex Triggers
-
Salesforce Developers: Apex Developer Guide