Autoren der Dokumentation: Björn Scheppler
Dokumentation letztmals aktualisiert: 5.10.2019
Dieses Projekt veranschaulicht, wie ein Prozess in Camunda asynchron per REST einem Umsystem eine Nachricht übermittelt und auf eine Antwort wartet. Die Antwort wird als Callback ebenfalls per REST zurückgegeben und mittels MessageCorrelation mit der ursprünglichen Prozessinstanz verknüpft.
Das entsprechende BPMN-Modell sieht wie folgt aus:
Es sind zwei Maven-Projekte mit Spring Boot-Applikationen in dieser Github-Repository:
- Camunda-Applikation (async-rest-messaging-template-camunda):
- Klassische Camunda-Prozessapplikation erstellt mit https://github.com/zhaw-gpi/camunda-spring-boot-template
- Enthält das oben abgebildete Prozessmodell,
- Ein JavaDelegate SendRequestDelegate, welcher die zweite Applikation per REST aufruft und ihr eine JSON-Nachricht übergibt basierend
- auf der Klasse Demo. Diese umfasst folgende Eigenschaften:
- URL: die Callback-URL, damit das aufgerufene System weiss, an wen es die Antwort senden muss.
- Body: Statischer Inhalt "Ich bin der super-spannende Inhalt dieser Nachricht."
- BusinessKey: Der BusinessKey der Prozessinstanz, was später für die MessageCorrelation wichtig ist.
- Es wird dabei lediglich geprüft, ob dieser Aufruf technisch funktioniert hat (Antwort 202).
- Um den Callback-Aufruf per REST verarbeiten zu können, gibt es den CamundaRestController, welcher ein PostMapping auf die Methode addDumo enthält. Diese erwartet eine JSON-Nachricht basierend auf der
- Klasse Dumo. Diese umfasst folgende Eigenschaften:
- BusinessKey: Derselbe BusinessKey, welcher schon beim Aufruf an das Umsystem übergeben wurde für die MessageCorrelation
- Time: Just for fun, übermittelt das aufrufende System dessen aktuelles Datum und Uhrzeit als String.
- Basierend auf dem BusinessKey und dem Namen der Message im BPMN-Modell ("Antwort") versucht der CamundaRestController diejenige Prozessinstanz zu finden, welche a) diesen BusinessKey aufweist und b) im Status ist, dass sie auf eine Message "Antwort" wartet.
- Gelingt dies, wird automatisch die Ausführung der Prozessinstanz fortgesetzt.
- Umsystem (async-rest-messaging-external-system):
- Klassische Spring-Boot-Web-Applikation erstellt auf Basis von https://github.com/zhaw-gpi/vekacenter
- Enthält die schon aus der Camunda-Applikation bekannten Klassen Demo und Dumo
- Enthält die Klasse ExternalSystemRestController, welche dem oben genannten CamundaRestController entspricht, also ein PostMapping auf eine Methode enthält, die nur zwei Dinge durchführt:
- Aufrufen einer Methode waitAndSendResponse in der Klasse AsyncMethods
- Synchron mit Status 202 antworten.
- Die Methode waitAndSendResponse
- ist mit @Async annotiert, d.h. sie unterbricht nicht den aufrufenden Thread, sondern wird in einem eigenen Thread ausgeführt.
- Dabei wird zunächst einmal 5 Sekunden gewartet. Damit wird simuliert, dass hier z.B. ein Mensch in einem System etwas machen muss, bevor der Camunda-Applikation eine Antwort gesendet werden kann.
- Dann wird die aktuelle Uhrzeit als Antwort aufbereitet.
- Per REST wird nun die Antwort (aktuelle Uhrzeit und der bekannte BusinessKey) an die Camunda-Applikation gesendet, konkret an die in der Eigenschaft URL aus Demo bekannte URL.
- Erstmalig oder bei Problemen ein
mvn clean install
für beide Maven-Projekte durchführen - Bei Änderungen am POM-File oder bei (Neu)kompilierungsbedarf genügt ein
mvn install
- Für den Start ist ein
java -jar .\target\NAME DES JAR-FILES.jar
beider Applikationen erforderlich. - Das Beenden geschieht mit CTRL+C
- localhost:8092
- Anmelden mit a, a
- Tasklist
- Start Process -> "Beispielprozess"
- Irgendeinen Business Key eingeben und auf Start klicken.
- Fünf Sekunden warten
- Folgendes sollte nun passiert sein:
- In der Konsole der external-system-Applikation sollte eine neue Zeile hinzugefügt sein mit "Key und Nachricht: ..."
- In der Tasklist sollte eine neue Aufgabe "Antwort auswerten" erscheinen
- Aufgabe aufnehmen (Claim)
- Zeitstempel "anschauen"
- Complete drücken
- Zur "Kontrolle" im Cockpit schauen, ob die Prozessinstanz durch ist.