TL;DR;

Um Entscheidungen mit nur einem einzigen Ausgangspfad zu modellieren, wird in Camunda Prozessen das Exclusive Gateway verwendet. Dabei muss für jeden ausgehenden Pfad eine Bedingung hinterlegt werden. In der Bedingung kann einfach über den Namen auf eine Variable im Prozesskontext zugegriffen werden. Außerdem kann – und sollte – ein Pfad als Default Flow definiert werden, welcher ausgeführt wird wenn keine der anderen Bedingungen zutrifft.

 

In meinen beiden letzten Artikeln haben wir uns zuerst mit Prozessvariablen und anschließend mit Gateways beschäftigt. Im heutigen Artikel möchte ich euch zeigen wie man beides kombinieren kann um Entscheidungen in Prozessen abzubilden.

In fast jedem Prozess müssen wir, auf der Basis von Daten im Kontext, Entscheidungen treffen die den weiteren Verlauf des Prozesses beeinflussen. Ein häufiges Beispiel wäre ein Freigabeprozesse, bei dem ein Benutzer einen Vorgang freigeben oder ablehnen kann. Je nachdem wie die Entscheidung ausfällt, läuft der Prozess dann weiter oder wird beendet.

Die einfachste Art einer solche Entscheidung können wir mit einem Exclusive Gateway modellieren. Dieses Gateway kann eine beliebige Anzahl an Ausgängen haben, welche alle eine Bedingung enthalten müssen. Die Engine wählt dann den ersten Ausgang, bei dem die Bedienung erfüllt ist. Wie das Wort “Exclusive” schon vermuten lässt, wird immer nur ein Ausgang des Gateways aufgerufen.

Um das Ganze mal an einem sehr einfachen Beispiel zu demonstrieren, habe ich mir den folgenden Prozess ausgedacht. Er besteht lediglich aus zwei Exklusive Gateways und zwei Service Tasks. Die Service Tasks enthalten jeweils nur eine Zeile Code, welche eine Meldung auf der Console ausgibt. Die Meldung lautet entweder “Value is true” oder “Value is false”, je nachdem ob der obere oder untere Pfad des Prozesses ausgeführt wird.

Damit die Engine weiß, welchen der beiden Pfade sie durchlaufen soll, müssen wir jetzt die Bedingungen für das vordere Exclusive Gateway konfigurieren. Genauer gesagt müssen wir die Bedingung für die einzelnen ausgehenden Stränge definieren.

Dafür wählen wir zunächst den oberen Pfeil und schauen uns das Properties Panel im Modeler an. Dort wählen wir im Dropdown “Condition Type” den Wert “Expression” aus. Jetzt können wir unsere Bedingung formulieren. In unserem Fall wollen wir prüfen ob die Variable mit dem Namen “VALUE” den Wert true enthält.

Die Expression dafür lautet: ${VALUE == true}

Mit VALUE greifen wir hier auf die Prozessvariable mit dem entsprechenden Namen zu.

Auf die gleiche Weise hinterlegen wir jetzt beim Pfeil des unteren Strangs die Expression ${VALUE == false}

Mehr müssen wir nicht tun um das Exclusive Gateway zu konfigurieren.

Jetzt starten wir unsere Prozessanwendung für einen Test. Da wir für unseren Prozess jetzt eine Variable mit dem Namen “VALUE” benötigen, müssen wir diese beim Start der Instanz angeben. Dafür öffnen wir wieder die Tasklist im Browser, klicken auf “Start Process” und wählen unseren Prozess.

Bevor wir den Prozess starten, können wir im Dialog auf den Button “Add a variable” klicken.

Als Namen für die Variable verwenden wir “VALUE” und als Type Boolean. Für den ersten Test lassen wir die Checkbox unausgewählt.

blank

Nach einem Klick auf Start, sehen wir in der Konsole sofort die entsprechende Ausgabe:

Value is false

Für den zweiten Test starten wir erneut eine Prozessinstanz. Dieses Mal setzen wir die Variable mit der Checkbox auf true.

In der Konsole sollte wie erwartet die Meldung “Value is true” stehen.

Default Flow

Dieses Beispiel zeigt auf recht einfache Weiße wie man ein Exclusive Gateway richtige konfiguriert. Neben der Expression gibt es nur noch eine weitere Einstellungsmöglichkeit für unser Gateway, nämlich den Default Flow.

Die Entscheidung in unserem bisherigen Beispiel lässt sich recht einfach als Code darstellen:

if(VALUE == true)

} else if(VALUE == false)

}

Der Default Flow würde diesen Code jetzt noch um ein “else” Statement ergänzen. Dieses würde ausgeführt wenn keine der zuvor geprüften Bedingungen zutreffen würde.

Der Default Flow ist ein weiterer ausgehender Pfad, welcher keine Bedingung definiert hat. Zusätzlich muss er im Modeler als Default Flow markiert werden. Dafür wählt man den entsprechenden Pfeil aus, klickt erst auf den kleinen Schraubenschlüssel und wählt dann den Punkt “Default Flow” aus.

blank

 

Zu erkennen ist der Default Flow an einem kleinen Querstrich am Anfang des Pfeils:

blank

Da die Engine einen Fehler wirft falls keine der Bedingungen zutrifft und kein Default Flow definiert ist, sollte man wenn es fachlich möglich ist immer einen Default Flow definieren. Dieser könnte z.B. einen UserTask erzeugen um das ursächliche Problem zu beheben.

Das war auch schon alles was es zu den Exclusive Gateways zu sagen gibt. Den Code für das Beispiel findet ihr wie immer hier: https://github.com/pragtics/camunda-demos/tree/master/exclusive-gateway