|
<< Click to Display Table of Contents >> Navigation: PUM - Modellierung und Codeerzeugung > Strukturen und Muster > Event Structure |
Diese Struktur ermöglicht das Senden eines Events auf den Eventbus (und damit über RabbitMQ). Die Struktur stellt einen API-Call SendApplicationEvent zur Verfügung. Dabei liefert Gemstone/S den Event bei RabbitMQ ab. Der Programmierer füllt die Instanz der Klasse TSTAPIGeneralCarrierEventClass aus und führt den obigen API Call aus.
Die Auslieferung der Events oder Nachrichten geschieht über den Exchange "aqm.topic". Die Struktur der gesamten Events der Anwendung ist komplett außerhalb von PUM. Der Entwickler muß sich eine entsprechende Struktur ausdenken.
In einer Anwendung haben wir eine Queue geschaffen, die "allEvents" hieß. Diese wurde mit "aqm.topic" verbunden und bekam den RoutingKey "#". Diese Queue bekam alle Events zugestellt. Dann wurden noch Events pro Session versandt (RoutingKey = sessionGop) und dann noch für spezielle Benutzergruppen ("interviewer", "supervisoren").
Die Anwendungen haben dann mehrere "subscribe" - einmal auf "sessionGop", "interviewer" und einmal auf "sessionGop","supervisoren".
Die Events aus "allEvents" wurde durch ein C# Programm abgeholt und in eine Datenbank geschrieben (allerdings wurden hier viele Informationen ausgeblendet).
Beispielimplementation des API-Calls auf dem Server:
apiEventSendApplicationEvent: aTSTAPIGeneralCarrierEventClass options: aMSKRestCallOptions
| |
"
Wir checken ggfs. ob der Benutzer den Call überhaupt machen darf ... der
eigentliche Check muss entsprechend kodiert werden: isAllowedToSendEvent
"
aMSKRestCallOptions getUser isAllowedToSendEvent
ifFalse:[
"Wir nutzen die vordefinierte Access Denied Exception"
TSTEnumErrorDefinition errCodeAccessDeniedThrowSignal: aMSKRestCallOptions
].
"Wir bauen die Rückgabestruktur zusammen"
^(self restAnswerClass
okRequestFor: aMSKRestCallOptions restCallInstance
result: (TSTAPIGeneralResult with: true))
"Wir ändern keine Daten - daher kann man auf ein Commit verzichten, und einfach ein Abort erzwingen"
successWithoutCommitCall;
yourself