SSE-Benachrichtigung
Der SSE (Server-Sent Events) Benachrichtigungsstrom ist der primäre Mechanismus, um einen Service-Client zu wecken, wenn neue Bestellungen oder Befehle verfügbar sind. Der Strom sendet nur leichte Benachrichtigungen. Er enthält niemals vollständige Bestell- oder Befehlspayloads. Wenn eine Benachrichtigung eingeht, sollte der Client sofort GET /orders/location für die tatsächlichen Daten abfragen.
Endpunkt
GET https://{host}/notifications/service/streamHeader:
| Header | Erforderlich | Beschreibung |
|---|---|---|
api_key | Ja | API-Schlüssel des Service-Geräts |
Query-Parameter:
| Parameter | Typ | Standard | Beschreibung |
|---|---|---|---|
orderNumber | long | -1 | Zuletzt verarbeitete Bestellnummer für offset-basierte Wiederverbindung |
commandNumber | long | 0 | Zuletzt verarbeitete Befehls-ID für offset-basierte Wiederverbindung |
Antwort: text/event-stream (SSE-Stream mit SseEmitter)
Ereignisablauf
Nach der Verbindung sendet der Server Ereignisse in der folgenden Reihenfolge:
Client Server
| |
|--- GET /notifications/service/stream --->|
| |
|<-- event: ready |
| data: {"subscriptionId": "...",|
| "locationName": "..."} |
| |
|<-- event: message | (bei neuen Bestellungen oder Befehlen)
| data: {"apiKey": "...", |
| "licenseCode": "...", |
| "scope": "..."} |
| |
|<-- event: keepalive | (alle 15 Sekunden)
| data: {} |1. Ready-Ereignis
Bei erfolgreicher Verbindung sendet der Server sofort ein ready-Ereignis mit den Abonnement-Metadaten:
event: ready
data: {"subscriptionId":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","locationName":"Main Floor"}Die subscriptionId identifiziert diese SSE-Verbindung eindeutig. Der locationName gibt an, welchen Standort der Client abonniert hat.
2. Message-Ereignisse
Wenn neue Bestellungen oder Befehle für den Standort verfügbar sind, sendet der Server ein message-Ereignis mit einer MessagesAvailableEvent-Payload:
event: message
data: {"apiKey":"abc123-def456","licenseCode":"LICENSE01","scope":"SESSION"}Die MessagesAvailableEvent-Payload:
| Feld | Typ | Beschreibung |
|---|---|---|
apiKey | string | Der API-Schlüssel des Abonnements |
licenseCode | string | Der Lizenzcode des Mandanten |
scope | string | Entweder SESSION oder LICENSE, gibt den Broadcast-Bereich an |
Dies ist ein Signal zum Abrufen. Es enthält keine Bestell- oder Befehlsdaten.
3. Keepalive-Ereignisse
Der Server sendet alle 15 Sekunden ein keepalive-Ereignis, um die Verbindung aufrechtzuerhalten:
event: keepalive
data: {}Wenn 60 Sekunden lang kein Keepalive empfangen wird, sollte der Client annehmen, dass die Verbindung unterbrochen ist, und sich neu verbinden.
Verbindungs-Timeout
Der Dienstendpunkt konfiguriert den Emitter mit einem Zeitlimit von 60 Minuten. Der Scheduler sendet alle 15 Sekunden Keepalives. Behandeln Sie Schließen, Timeout und Netzwerkfehler durch erneutes Verbinden. Verlassen Sie sich nicht darauf, dass Keepalives den Stream unbegrenzt verlängern.
Ein Client kann nach 60 Sekunden ohne Keepalive eine Wiederverbindung starten. Das ist ein Vorschlag für die lokale Überwachung, keine Zusicherung des Servers über den Erkennungszeitpunkt eines Netzwerkfehlers.
Wiederverbindung mit Offset
Stellen Sie bei der Wiederverbindung nach einer Unterbrechung die zuletzt verarbeitete Bestellnummer und Befehls-ID als Query-Parameter bereit. Die Offsets bestimmen, welche ausstehenden Vorgänge eine Benachrichtigung auslösen. Sie sind kein Ereignisprotokoll und keine Verarbeitungsbestätigung:
curl -i -H "api_key: abc123-def456-ghi789" \
"https://{host}/notifications/service/stream?orderNumber=12345&commandNumber=42"orderNumber— Die höchste bereits verarbeitete Bestell-number. Übergeben Sie-1oder lassen Sie den Parameter weg, um keinen Offset zu verwenden (von Anfang an beginnen).commandNumber— Die höchste bereits verarbeitete Befehls-ID. Übergeben Sie0oder lassen Sie den Parameter weg, um keinen Offset zu verwenden.
Der Server verwendet diese Offsets, um zu filtern, welche Bestellungen und Befehle Benachrichtigungen auslösen. Er verfolgt die gesendeten Offsets im Arbeitsspeicher für jedes Abonnement.
Fehlerantworten
Der SSE-Stream kann die folgenden HTTP-Statuscodes zurückgeben:
| Status | Bedeutung |
|---|---|
| 401 | Nicht autorisiert — Ungültiger oder fehlender API-Schlüssel |
| 503 | Dienst nicht verfügbar — Server vorübergehend nicht erreichbar. Client sollte mit exponentiellem Backoff wiederholen |
Implementierungshinweise für Clients
Stream prüfen
Verwenden Sie einen Dienstclient, der den Header api_key senden kann. Prüfen Sie die Verbindung beispielsweise so:
curl -N -H "api_key: abc123-def456-ghi789" \
"https://{host}/notifications/service/stream?orderNumber=-1&commandNumber=0"Prüfen Sie den vorgesehenen Standort im ready-Ereignis und anschließend die keepalive-Ereignisse. Lösen Sie einen abgestimmten Testvorgang aus, warten Sie auf message und rufen Sie die Vorgänge per Polling ab. Die message-Nutzlast enthält Zugangsdaten. Übernehmen Sie den Rohstream nicht in Protokolle oder Supportanfragen.
Ohne Verlust des Verarbeitungsstands erneut verbinden
- Schließen Sie den fehlgeschlagenen Stream vor einer neuen Verbindung.
- Verwenden Sie begrenzten exponentiellen Backoff, etwa 1, 2, 4, 8 Sekunden bis maximal 60 Sekunden. Untersuchen Sie wiederholte Fehler.
- Laden Sie Bestell- und Befehlsoffsets aus dauerhaft gespeicherten Verarbeitungsständen. Halten Sie beide Kennungsfolgen getrennt.
- Setzen Sie einen Offset nicht über noch offene oder zu klärende Vorgänge hinaus.
- Öffnen Sie den Stream und fragen Sie ausstehende Vorgänge ab. Ein
ready-Ereignis darf gespeicherte Offsets nicht zurücksetzen. - Prüfen Sie dauerhafte Verarbeitungsstände, bevor Sie eine externe Aktion wiederholen.
Browserbeispiele mit EventSource benötigen den Schlüssel in der URL. Bevorzugen Sie für eingesetzte Kassenintegrationen einen Dienstclient mit Headerauthentifizierung und schließen Sie Zugangsdaten aus URL- und Nutzlastprotokollen aus.
Was der Client tun muss
- Die SSE-Verbindung mit dem API-Schlüssel öffnen.
- Bei
readydiesubscriptionIdundlocationNameaufzeichnen. - Bei
messagesofortGET /orders/locationaufrufen. - Die zuletzt verarbeiteten
orderNumberundcommandNumberfür die Wiederverbindung im Auge behalten. - Wenn die Verbindung abbricht, mit exponentiellem Backoff und den Offset-Parametern erneut verbinden.
Was der SSE-Stream NICHT tut
- Der SSE-Stream enthält keine Bestelldaten oder Befehlspayloads. Er ist nur ein Wecksignal.
- Der SSE-Stream bestätigt nicht, dass Sie Bestellungen verarbeitet haben. Die Verarbeitungsbestätigung erfolgt über die Statusaktualisierungs- und Befehlsantwort-Endpunkte.
Nächste Schritte
- Polling — Bestellungen und Befehle bei Benachrichtigung abrufen
- Auf Befehle antworten — Auf abgerufene Befehle antworten