Event-Bus
Der Event-Bus veröffentlicht Runtime- und Anwendungsaktivität für Monitoring, Logging, Metriken und reaktive Nebeneffekte. Diese Seite ist eine API-Referenz; die Ausschnitte setzen einen ausführbaren Lua-Entry mit dem aufgeführten Modul und den erforderlichen Berechtigungen voraus.
Laden
local events = require("events")
Events abonnieren
Abonniert ein System oder Systemmuster mit einem optionalen Filter für die Event-Art:
-- Subscribe to all order events
local sub, err = events.subscribe("orders.*")
if err then
return nil, err
end
-- Process events
local ch = sub:channel()
while true do
local evt, ok = ch:receive()
if not ok then break end
print(evt.system, evt.kind, evt.path)
-- Process evt.data when the publisher supplied a payload.
end
Übergeben Sie ein zweites Argument, um die Zustellung auf eine Art zu beschränken, beispielsweise events.subscribe("users", "user.created"). Ohne Art werden alle Arten des passenden Systems akzeptiert.
| Parameter | Typ | Beschreibung |
|---|---|---|
system |
string | System-Muster (unterstützt Wildcards wie "test.*") |
kind |
string | Event-Art-Filter (optional) |
Gibt zurück: Subscription, error
Events senden
Ein Ereignis an den Event-Bus senden:
-- Send order created event
local ok, err = events.send("orders", "order.created", "/orders/123", {
order_id = "123",
customer_id = "456",
total = 99.99
})
if err then
return nil, err
end
-- Send without data
local heartbeat_sent, heartbeat_err = events.send("system", "heartbeat", "/health")
if heartbeat_err then
return nil, heartbeat_err
end
| Parameter | Typ | Beschreibung |
|---|---|---|
system |
string | System-Identifikator |
kind |
string | Event-Art/-Typ |
path |
string | Event-Pfad für Routing |
data |
any | Event-Payload (optional) |
Gibt zurück: boolean, error
Eine erfolgreiche Rückgabe bestätigt, dass die Runtime das Senden angenommen hat. Sie bestätigt nicht, dass ein Subscriber das Event empfangen oder verarbeitet hat.
Subscription-Methoden
Channel abrufen
Den Channel zum Empfangen von Ereignissen holen:
local json = require("json")
local ch = sub:channel()
local evt, ok = ch:receive()
if ok then
print("System:", evt.system)
print("Kind:", evt.kind)
print("Path:", evt.path)
local encoded, encode_err = json.encode(evt.data)
if encode_err then return nil, encode_err end
print("Data:", encoded)
end
Jedes Event enthält system, kind und path. Das Feld data ist nur vorhanden, wenn der Publisher ein von nil verschiedenes Payload angegeben hat.
Subscription schließen
Abonnement beenden und Channel schließen:
local closed = sub:close() -- true
Das Schließen ist idempotent. Nachdem der Channel geschlossen wurde, gibt receive() nach dem Leeren gepufferter Events nil, false zurück.
Berechtigungen
| Aktion | Ressource | Beschreibung |
|---|---|---|
events.subscribe |
system | Events von einem System abonnieren |
events.send |
system | Events an ein System senden |
Fehler
| Bedingung | Art | Wiederholbar |
|---|---|---|
| Leeres System | errors.INVALID |
nein |
| Leere Art beim Senden | errors.INVALID |
nein |
| Leerer Pfad | errors.INVALID |
nein |
| Policy abgelehnt | errors.INVALID |
nein |
| Ausführungs- oder Prozesskontext fehlt | errors.INTERNAL |
nein |
Siehe Fehlerbehandlung für den Umgang mit Fehlern.