Verwenden von Verzweigungen
Beim Modellieren eigener Prozesse können Sie das BPMN-Element Gateway vom Typ exclusive (Verzweigung vom Typ exklusiv) verwenden, um dynamische Prozesse mit einer Entscheidungslogik zu erstellen.
Zum Einstieg in das Arbeiten mit exklusiven Verzweigungen ist es hilfreich, wenn Sie zunächst einen einfachen Prozess mit einer Benutzeraktivität erstellen. Dieser Prozess sieht beispielsweise so aus:
![]() |
Das BPMN-Modell dieses beispielhaften Prozesses ist folgendermaßen aufgebaut:
<?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" targetNamespace="" exporter="d.velop process modeler"> <process id="exclusive_gateway_process" name="Exclusive Gateway Process" isExecutable="true"> <startEvent id="start" /> <userTask id="task_hello_world" name="Hello World" camunda:camundaUsers="${variables.get('dv_initiator')}" /> <endEvent id="end" /> <sequenceFlow id="s1" sourceRef="start" targetRef="task_hello_world" /> <sequenceFlow id="s2" sourceRef="task_hello_world" targetRef="end" /> </process> </definitions>
Diesen Beispielprozess erweitern Sie nun mit einer Verzweigung. Anhand des Wertes einer Prozessvariablen führt dieser Prozess entweder zu der Benutzeraktivität oder wird direkt beendet.
Hinzufügen einer Verzweigung
Fügen Sie dem Prozess zunächst das BPMN-Element exclusiveGateway hinzu. Das exclusiveGateway-Element repräsentiert eine Verzweigung mit nur einem einzigen möglichen Ausgangspfad. Ersetzen Sie die vorhandenen Sequenzflüsse anschließend mit den folgenden Sequenzflüssen:
... <process id="exclusive_gateway_process" name="Exclusive Gateway Process" isExecutable="true"> <startEvent id="start" /> <exclusiveGateway id="gateway" default="gateway-option-b" /> <userTask id="task_hello_world" name="Hello World" camunda:camundaUsers="${variables.get('dv_initiator')}" /> <exclusiveGateway id="join" /> <endEvent id="end" /> <sequenceFlow id="s1" sourceRef="start" targetRef="gateway" /> <sequenceFlow id="gateway-option-a" sourceRef="gateway" targetRef="task_hello_world" /> <sequenceFlow id="gateway-option-b" sourceRef="gateway" targetRef="join" /> <sequenceFlow id="s2" sourceRef="task_hello_world" targetRef="join" /> <sequenceFlow id="s3" sourceRef="join" targetRef="end" /> </process>
Erläuterung der Eigenschaften:
id:Die Eigenschaft wird als eindeutiger Bezeichner für die Verzweigung verwendet.
default: Die Eigenschaft definiert die ID des Sequenzflusses, der als Standard-Ausgangspfad der Verzweigung gewählt werden soll.
Der Prozess sieht dann beispielsweise so aus:
![]() |
Hinzufügen einer Bedingung
Alle Ausgangspfade einer exklusiven Verzweigung müssen eine Bedingung enthalten. Mithilfe dieser Bedingung ermittelt die Anwendung, welchem Pfad der Prozess folgen soll. Für den Beispielprozess fügen Sie dem Sequenzfluss gw-option-a die Bedingung hinzu, dass dieser Pfad abhängig von der Variable amount gewählt wird. Entspricht diese Variable einem Wert größer 1000, soll der Sequenzfluss gw-option-a gewählt werden.
... <sequenceFlow id="gw-option-a" sourceRef="gateway" targetRef="task_hello_world" > <conditionExpression xsi:type="tFormalExpression">#{variables.get("amount") > 1000}</conditionExpression> <sequenceFlow> ...
Um eine Prozessvariable verwenden zu können, müssen Sie diese der Prozessdefinition hinzufügen. In der Prozessdefinition fügen Sie die BPMN-Elemente extensionElements und camunda:properties zum BPMN-Element process hinzu. Zum Definieren der Prozessvariable fügen Sie dem BPMN-Element camunda:properties noch das Element camunda:property hinzu. In diesem Beispiel fügen Sie die Variable amount vom Typ Number ein. Diese ist eine Pflichtvariable, die beim Start mitgegeben werden muss.
... <process id="exclusive_gateway_process" name="Exclusive Gateway Process" isExecutable="true"> <extensionElements> <camunda:properties> <camunda:property name="variable:amount*" value="Number!" /> </camunda:properties> </extensionElements> ... </process>
Damit das BPMN-Diagramm im Modellierungswerkzeug sowie der Benutzeroberfläche korrekt dargestellt werden kann, wurde es noch um Diagramminformationen erweitert. Die finale BPMN-Definition sieht folgendermaßen aus:
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" targetNamespace="" exporter="d.velop process modeler"> <process id="exclusive_gateway_process" name="Exclusive Gateway Process" isExecutable="true"> <extensionElements> <camunda:properties> <camunda:property name="variable:amount*" value="Number!" /> </camunda:properties> </extensionElements> <startEvent id="start" /> <exclusiveGateway id="gateway" default="gateway-option-b" /> <userTask id="task_hello_world" name="Hello World" camunda:candidateUsers="${variables.get('dv_initiator')}" /> <exclusiveGateway id="join" /> <endEvent id="end" /> <sequenceFlow id="s1" sourceRef="start" targetRef="gateway" /> <sequenceFlow id="gateway-option-a" sourceRef="gateway" targetRef="task_hello_world"> <conditionExpression xsi:type="tFormalExpression">#{variables.get("amount") > 1000}</conditionExpression> </sequenceFlow> <sequenceFlow id="gateway-option-b" sourceRef="gateway" targetRef="join" /> <sequenceFlow id="s2" sourceRef="task_hello_world" targetRef="join" /> <sequenceFlow id="s3" sourceRef="join" targetRef="end" /> </process> <!-- Diagram information --> <bpmndi:BPMNDiagram id="BPMNDiagram_1"> <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="exclusive_gateway_process"> <bpmndi:BPMNShape id="start_di" bpmnElement="start"> <dc:Bounds x="179" y="199" width="36" height="36" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape id="gateway_di" bpmnElement="gateway" isMarkerVisible="true"> <dc:Bounds x="275" y="192" width="50" height="50" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape id="task_hello_world_di" bpmnElement="task_hello_world"> <dc:Bounds x="410" y="80" width="100" height="80" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape id="join_di" bpmnElement="join" isMarkerVisible="true"> <dc:Bounds x="595" y="192" width="50" height="50" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape id="end_di" bpmnElement="end"> <dc:Bounds x="702" y="199" width="36" height="36" /> </bpmndi:BPMNShape> <bpmndi:BPMNEdge id="s1_di" bpmnElement="s1"> <di:waypoint x="215" y="217" /> <di:waypoint x="275" y="217" /> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge id="gateway-option-a_di" bpmnElement="gateway-option-a"> <di:waypoint x="300" y="192" /> <di:waypoint x="300" y="120" /> <di:waypoint x="410" y="120" /> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge id="gateway-option-b_di" bpmnElement="gateway-option-b"> <di:waypoint x="325" y="217" /> <di:waypoint x="595" y="217" /> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge id="s2_di" bpmnElement="s2"> <di:waypoint x="510" y="120" /> <di:waypoint x="620" y="120" /> <di:waypoint x="620" y="192" /> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge id="s3_di" bpmnElement="s3"> <di:waypoint x="645" y="217" /> <di:waypoint x="702" y="217" /> </bpmndi:BPMNEdge> </bpmndi:BPMNPlane> </bpmndi:BPMNDiagram> </definitions>
Sie können den Wert der Variablen amount nun zum Beispiel beim Start des Prozesses belegen, und so den Prozessverlauf beeinflussen.