Erfassen Sie Ihre Fortschritte
Trailhead-Startseite
Trailhead-Startseite

Definieren und Veröffentlichen von Plattformereignissen

Lernziele

Nachdem Sie diese Lektion abgeschlossen haben, sind Sie in der Lage, die folgenden Aufgaben auszuführen:
  • Definieren eines Plattformereignisses
  • Beschreiben, wie Plattformereignisnachrichten veröffentlicht werden können
  • Veröffentlichen eines Ereignisses mithilfe einer Apex-Methode
  • Veröffentlichen eines Ereignisses mithilfe von Klicks in einem Prozess oder Flow
  • Veröffentlichen eines Ereignisses mithilfe der REST-API durch Einfügen eines sObjects

Definieren und Veröffentlichen von Plattformereignissen

Sie wissen nun, was Plattformereignisse sind und wann sie verwendet werden. Gehen wir nun das Definieren eines Plattformereignisses praktisch an! Erinnern Sie sich noch an die Agentur Cloud News? Lassen Sie uns eine Definition eines Plattformereignisses erstellen, die die Daten von Nachrichtenereignissen enthält.

Definieren Sie ein Plattformereignis namens "Cloud News":

  1. Geben Sie unter Setup im Feld "Schnellsuche" den Text "Plattformereignisse" ein und wählen Sie dann Plattformereignisse aus.
  2. Klicken Sie auf der Seite "Plattformereignisse" auf Neues Plattformereignis.
  3. Geben Sie "Cloud News" in "Bezeichnung" ein.
  4. Geben Sie "Cloud News" in "Bezeichnung - Plural" ein.
  5. Geben Sie "Cloud news events deliver news at your fingertips" in "Beschreibung" ein.
  6. Behalten Sie für "Veröffentlichungsverhalten" die Standardeinstellung Nach Commit veröffentlichen bei.
  7. Klicken Sie auf Speichern.
  8. Klicken Sie in der Themenliste "Benutzerdefinierte Felder & Beziehungen" auf Neu.
  9. Wählen Sie Text und klicken Sie auf Weiter.
  10. Geben Sie "Location" in "Feldbezeichnung/-name" ein.
  11. Geben Sie in "Länge" 100 ein. Übernehmen Sie die Standardeinstellungen für die anderen Felder und lassen Sie das Feld "Beschreibung" frei. Klicken Sie auf Speichern.
  12. Führen Sie die Schritte 7-9 aus, um die nächsten beiden Felder hinzuzufügen:
    Feldbezeichnung/-name Feldtyp
    Dringend Kontrollkästchen
    News Content Textfeld (Lang)

Sie haben für das zuvor definierte Ereignis "Cloud News" Felder verschiedener Typen erstellt, z. B. ein Textfeld und ein Kontrollkästchen. Plattformereignisse unterstützen die folgenden Feldtypen:

  • Kontrollkästchen
  • Datum
  • Datum/Uhrzeit
  • Zahl
  • Text
  • Textfeld (Lang)

Ereignisspeicherung und das Systemfeld "ReplayId"

Salesforce speichert Plattformereignisse mit hohem Volumen 72 Stunden im Ereignisbus Ereignisse mit Standardvolumen, die vor Version Spring '19 definiert wurden, werden 24 Stunden im Ereignisbus gespeichert 

Hinweis

Hinweis

Neu definierte Ereignisse haben standardmäßig ein hohes Volumen. Ereignisse mit Standardvolumen sind die Vorgänger von Ereignissen mit hohem Volumen und können nicht länger definiert werden.

Mit API CometD-Clients können Sie gespeicherte Ereignisse aus dem Ereignisbus abrufen. Sie können alle gespeicherten Ereignisse abrufen oder die Wiedergabe-ID eines Ereignisses als Basis für den abgerufenen Teil von Ereignissen angeben. Mit Apex-Auslösern können Sie einen angehaltenen Auslöser fortsetzen und die frühesten zurückbehaltenen unverarbeiteten Ereignisse auswählen. Im weiteren Verlauf dieses Moduls lernen Sie, wie Sie Abonnements von Apex-Auslösern verwalten.

Auch wenn Salesforce Ereignisdatensätze vorübergehend speichert, können Sie diese nicht mithilfe von SOQL oder SOSL abfragen. Außerdem können Sie Ereignisdatensätze nicht auf der Benutzeroberfläche in Berichten, Listenansichten und Suchvorgängen verwenden. Sie können vorherige Ereignisse nur abrufen, wenn Sie sie in CometD abonnieren und eine "ReplayId"-Option verwenden. Das Abonnieren von Ereignissen erklären wir Ihnen in der nächsten Lektion.

Jeder Ereignisnachricht wird eine undurchsichtige ID zugeordnet, die im Feld "ReplayId enthalten ist. Der Feldwert "ReplayId", der vom System eingetragen wird, wenn das Ereignis an Abonnenten gesendet wird, bezieht sich auf die Position des Ereignisses im Ereignis-Stream. "Replay ID"-Werte sind bei aufeinander folgenden Ereignissen nicht unbedingt fortlaufend. So kann beispielsweise das Ereignis, das auf das Ereignis mit der ID 999 folgt, die ID 1025 haben. Ein Abonnent kann einen Wiedergabe-ID-Wert speichern und beim erneuten Abonnement für den Abruf von Ereignissen verwenden, die innerhalb des Zeitfensters für die Speicherung liegen. Abonnenten können so beispielsweise verpasste Ereignisse nach einem Verbindungsfehler abrufen. Abonnenten dürfen keine neuen Wiedergabe-IDs auf der Grundlage einer gespeicherte Wiedergabe-ID berechnen, um auf andere Ereignisse im Stream zu verweisen.

API-Namenssuffix

Wenn Sie ein Plattformereignis erstellen, fügt das System zum Erstellen des API-Namens des Ereignisses das Suffix "__e" an. Für das Ereignis "Cloud News" lautet der API-Name beispielsweise "Cloud_News__e". Verwenden Sie den API-Namen, wenn Sie z. B. in Apex, über die REST-API und Enterprise-API programmgesteuert auf das Ereignis verweisen.

Plattformereignisse und Transaktionen

Plattformereignisse, die mit dem Veröffentlichungsverhalten Nach Commit veröffentlichen definiert sind, sind transaktional und können zurückgesetzt werden. Diejenigen, die mit dem Verhalten Sofort veröffentlichen definiert sind, sind dies jedoch nicht und können nicht zurückgesetzt werden. Beachten Sie folgende Verhaltensunterschiede.

Veröffentlichungsverhalten "Nach Commit veröffentlichen"

Ein Plattformereignis, das mit dem Verhalten Nach Commit veröffentlichen definiert ist, wird erst veröffentlicht, wenn für die Transaktion ein Commit erfolgt ist. Definieren Sie ein Ereignis mit dieser Option, wenn Abonnenten auf Daten angewiesen sind, für die Veröffentlichungstransaktion einen Commit ausführt. Ein Prozess veröffentlicht beispielsweise eine Ereignisnachricht und erstellt einen Aufgabendatensatz. Ein zweiter Prozess, der für das Ereignis abonniert ist, wird ausgelöst und erwartet, den Aufgabendatensatz vorzufinden. Ein weiterer Grund für die Wahl dieses Verhaltens ist, wenn Sie nicht möchten, dass die Ereignisnachricht veröffentlicht wird, falls die Transaktion fehlschlägt.

Veröffentlichungsverhalten "Sofort veröffentlichen"

Ein Plattformereignis, das mit dem Verhalten Sofort veröffentlichen definiert ist, wird veröffentlicht, wenn der Veröffentlichungsaufruf erfolgt. Wählen Sie diese Option, wenn die Ereignisnachricht unabhängig vom Erfolg der Transaktion veröffentlicht werden soll. Wählen Sie diese Option auch, wenn der Publisher und die Abonnenten unabhängig sind und sich die Abonnenten nicht auf Daten verlassen, für die der Publisher einen Commit ausgeführt hat. So ist beispielsweise das Verhalten der sofortigen Veröffentlichung für ein Ereignis geeignet, das zu Protokollierungszwecken verwendet wird. Mit dieser Option kann ein Abonnent die Ereignisnachricht erhalten, bevor für Daten von der Publisher-Transaktion ein Commit ausgeführt wird.

Veröffentlichen von Ereignissen

Wenn sich Ihre Anwendung auf der Salesforce-Plattform befindet, können Sie Ereignisse mithilfe einer Apex-Methode oder deklarativer Tools wie Prozessgenerator oder Flow Builder veröffentlichen. Wenn Sie über eine externe Anwendung verfügen, können Sie Ereignisse mithilfe von Salesforce-APIs veröffentlichen.

Veröffentlichen von Ereignisnachrichten mithilfe von Apex

Zum Veröffentlichen von Ereignisnachrichten erstellen Sie eine Instanz des Ereignisses und übergeben sie an die EventBus.publish-Methode.

Das folgende Beispiel erstellt ein Ereignis des Typs Cloud_News__e, veröffentlicht es und prüft anschließend, ob die Veröffentlichung erfolgreich war oder Fehler aufgetreten sind. Die EventBus.publish()-Methode gibt ein Database.SaveResult-Objekt zurück, welches das Ergebnis der Veröffentlichung enthält. Wenn isSuccess() den Wert true zurückgibt, wird die Anforderung zum Veröffentlichen in Salesforce für dieses Plattformereignis mit hohem Volumen in die Warteschlange gestellt. Die Ereignisnachricht wird möglicherweise nicht sofort veröffentlicht. Wenn isSuccess() den Wert false zurückgibt, führte der Vorgang der Ereignisveröffentlichung zu Fehlern, die im Database.Error-Objekt zurückgegeben werden. Diese Methode löst aufgrund eines erfolglosen Veröffentlichungsvorgangs keine Ausnahme aus.

Sie können den Apex-Codeausschnitt in der Developer Console ausführen.

  1. Wählen Sie im Schnellzugriffsmenü (Schnellzugriffsmenü) Developer Console aus.
  2. Klicken Sie auf Debug | Open Execute Anonymous Window (Debuggen | Fenster für die anonyme Ausführung öffnen).
  3. Fügen Sie in dem neuen Fenster Folgendes hinzu und klicken Sie dann auf Execute (Ausführen).
    // Create an instance of the event and store it in the newsEvent variable
    Cloud_News__e newsEvent = new Cloud_News__e(
               Location__c='Mountain City',
               Urgent__c=true,
               News_Content__c='Lake Road is closed due to mudslides.');
    // Call method to publish events
    Database.SaveResult sr = EventBus.publish(newsEvent);
    // Inspect publishing result
    if (sr.isSuccess()) {
        System.debug('Successfully published event.');
    } else {
        for(Database.Error err : sr.getErrors()) {
            System.debug('Error returned: ' +
                         err.getStatusCode() +
                         ' - ' +
                         err.getMessage());
        }
    }

Um mehrere Ereignisse im selben Aufruf zu veröffentlichen, fügen Sie Ihre Ereignisse einer Ereignisliste hinzu und übergeben die Liste an die EventBus.publish()-Methode. Die Ausgabe dieser Methode ist ein Array von Database.SaveResult-Objekten, je eines für jedes veröffentlichte Ereignis. EventBus.publish() kann selbst dann bestimmte übergebene Ereignisse veröffentlichen, wenn andere Ereignisse aufgrund von Fehlern nicht veröffentlicht werden können. Die Methode EventBus.publish() löst keine Ausnahmen aus, die von einem nicht erfolgreichen Veröffentlichungsvorgang verursacht wurden. Dieses Verhalten ähnelt dem der Apex Database.insert()-Methode beim Aufruf mit der Option für Teilerfolg.

// List to hold event objects to be published.
List<Cloud_News__e> newsEventList = new List<Cloud_News__e>();
// Create event objects.
Cloud_News__e newsEvent1 = new Cloud_News__e(
           Location__c='Mountain City',
           Urgent__c=true,
           News_Content__c='Lake Road is closed due to mudslides.');
Cloud_News__e newsEvent2 = new Cloud_News__e(
           Location__c='Mountain City',
           Urgent__c=false,
           News_Content__c='Small incident on Goat Lane causing traffic.');
// Add event objects to the list.
newsEventList.add(newsEvent1);
newsEventList.add(newsEvent2);
// Call method to publish events.
List<Database.SaveResult> results = EventBus.publish(newsEventList);
// Inspect publishing result for each event
for (Database.SaveResult sr : results) {
    if (sr.isSuccess()) {
        System.debug('Successfully published event.');
    } else {
        for(Database.Error err : sr.getErrors()) {
            System.debug('Error returned: ' +
                        err.getStatusCode() +
                        ' - ' +
                        err.getMessage());
        }
    }
}
Hinweis

Hinweis

Die Salesforce-Plattform bietet Zuteilungen für die Anzahl der Ereignisse, die Sie in Ihrer Organisation definieren können und der Ereignisse, die Sie pro Stunde veröffentlichen können. Für Ereignisse, die mit dem Verhalten "Nach Commit veröffentlichen" konfiguriert sind, wird jede Ausführung einer Methode als eine DML-Anweisung auf den Apex-Grenzwert für DML-Anweisungen angerechnet. Sie können die Ausschöpfung des Grenzwerts mit der Apex-Methode Limits.getDMLStatements() überprüfen. Für Ereignisse, die mit dem Verhalten "Sofort veröffentlichen" konfiguriert sind, wird jede Ausführung einer Methode auf einen separaten Grenzwert für die Veröffentlichung von Ereignissen von 150 Aufrufen von EventBus.publish() angerechnet. Sie können die Ausschöpfung des Grenzwerts mit der Apex-Methode Limits.getPublishImmediateDML() überprüfen. Weitere Informationen finden Sie im Abschnitt "Ressourcen". 

Veröffentlichen von Ereignisnachrichten mithilfe von Klicks

Um Ereignisnachrichten ohne Code zu veröffentlichen, verwenden Sie die Funktion zur Datensatzerstellung in einem Prozess oder Flow.

Dieser Screenshot zeigt ein Beispiel der Aktion "Datensatz erstellen" im Prozessgenerator, die eine Cloud News-Ereignisnachricht veröffentlicht. Legen Sie "Datensatztyp" grundsätzlich auf das Plattformereignis fest, das Sie veröffentlichen möchten (Cloud News), und legen Sie dann die Werte für das Ereignis fest.

Die Aktion 'Datensatztyp erstellen' im Prozessgenerator ist auf den Datensatztyp 'Cloud News' festgelegt Die Felder des Ereignisses 'Cloud News' werden aufgefüllt.


Sie können eine Plattformereignisnachricht auch mithilfe eines Flows veröffentlichen. Konfigurieren Sie das Element "Datensatzerstellung", um eine Instanz des Plattformereignisses (Cloud_News__e) zu erstellen, und legen Sie dann die Werte für das Ereignis fest. Um den Wert eines booleschen Felds wie Urgent__c festzulegen, verwenden Sie {!$GlobalConstant.True}.

Veröffentlichen von Ereignisnachrichten mithilfe von Salesforce-APIs

Externe Anwendungen nutzen eine API zum Veröffentlichen von Plattformereignisnachrichten. Sie veröffentlichen Ereignisse, indem Sie Datensätze Ihres Ereignisses auf dieselbe Weise erstellen, in der Sie sObjects einfügen. Mithilfe von Salesforce-APIs wie SOAP-API, REST-API oder Bulk-API können Sie Datensätze für Plattformereignisse erstellen.

Für das Ereignis "Cloud News" können Sie z. B. Ereignisbenachrichtigungen veröffentlichen, indem Sie Cloud_News__e-Datensätze einfügen. Im folgenden Beispiel wird in der REST-API ein Ereignis des Typs Cloud_News__e erstellt.

REST-Endpunkt des sObjects:

/services/data/v45.0/sobjects/Cloud_News__e/

Anforderungstext einer POST-Anforderung:

{
   "Location__c" : "Mountain City",
   "Urgent__c" : true,
   "News_Content__c" : "Lake Road is closed due to mudslides."
}

Nach Erstellen des Datensatzes des Plattformereignisses sieht die REST-Antwort wie in dieser Ausgabe aus. Für mehr Übersichtlichkeit wurden die Header entfernt.

HTTP/1.1 201 Created
{
   "id" : "e00xx000000000B",
   "success" : true,
   "errors" : [ ],
   "warnings" : [ ]
}

Sie können ein beliebiges REST-API-Tool oder eine HTTP-Clientanwendung verwenden, um die REST-API aufzurufen. In Workbench führen Sie beispielsweise diese Schritte aus.

  1. Melden Sie sich bei Ihrer Trailhead Developer Edition-Organisation an.
  2. Öffnen Sie eine neue Registerkarte und navigieren Sie unter https://workbench.developerforce.com/login.php zu Workbench.
  3. Wählen Sie als Umgebung Production aus.
  4. Wählen Sie als API-Version die höchste verfügbare Versionsnummer aus.
  5. Aktivieren Sie I agree to the terms of service (Ich akzeptiere die Servicebedingungen).
  6. Klicken Sie auf Login with Salesforce.
  7. Klicken Sie auf dem nächsten Bildschirm auf Allow (Zulassen).
  8. Wählen Sie im oberen Menü utilities | REST Explorer aus.
  9. Klicken Sie auf POST (Posten).
  10. Ersetzen Sie den URI durch Folgendes:
    /services/data/v45.0/sobjects/Cloud_News__e
  11. Fügen Sie für "Anforderungstext" den folgenden Text im JSON-Format hinzu.
    {
       "Location__c" : "Mountain City",
       "Urgent__c" : true,
       "News_Content__c" : "Lake Road is closed due to mudslides."
    }
  12. Klicken Sie auf Execute (Ausführen). Die Antwort, die Salesforce nach dem Posten des Ereignisses zurückgibt, sieht wie folgt aus.
    {
      "id" : "e00xx0000000001AAA",
      "success" : true,
      "errors" : [ ],
      "warnings" : [ ]
    }

Alternativ können Sie ein Ereignis in der SOAP-API über einen Aufruf von create() oder in der Bulk-API mithilfe von Batchaufträgen veröffentlichen.

Nachdem Sie gelernt haben, wie Ereignisse definiert und veröffentlicht werden, wollen wir sie nun abonnieren!