Verändern von Prozessvariablen einer Multi-Instanz
Innerhalb von Subprozessen, die als Multi-Instanz konfiguriert sind, ist das Verändern von Prozessvariablen zunächst nur innerhalb des Geltungsbereichs der aktuellen Subprozessinstanz möglich.
Das folgende Prozessbeispiel zeigt einen Prozess, in dem einer Gruppe von Empfängern (Variable allAssignees) je eine Benutzeraufgabe zugewiesen wird. Hierfür wird eine Multi-Instanz verwendet. Im Rahmen der Benutzeraufgabe soll jeder Benutzer z.B. mithilfe eines Formulars eine Variable decision einfügen. Da jede Subprozessinstanz über ihren eigenen Geltungsbereich der Variablen verfügt, ist eine Zusammenfassung der jeweils in decision eingetragenen Werte aller Empfänger derzeit nicht möglich.
<?xml version="1.0" encoding="UTF-8"?> <definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" targetNamespace="" exporter="d.velop process modeler"> <process id="writeMultiInstanceVariables" name="WriteMultiInstanceVariables" isExecutable="true"> <extensionElements> <camunda:properties> <camunda:property name="variable:allAssignees*" value="[Identity]!" /> <camunda:property name="variable:assignee" value="Identity" /> <camunda:property name="variable:allDecisions" value="[String]" /> <camunda:property name="variable:decision" value="String" /> </camunda:properties> </extensionElements> <startEvent id="start" /> <endEvent id="end" /> <sequenceFlow id="s1" sourceRef="start" targetRef="subflow" /> <subProcess id="subflow"> <multiInstanceLoopCharacteristics camunda:collection="${variables.get('assignees')}" camunda:elementVariable="assignee" /> <startEvent id="subflow_start" /> <sequenceFlow id="s2-1" sourceRef="subflow_start" targetRef="subflow_usertask" /> <endEvent id="subflow_end" /> <sequenceFlow id="s2-2" sourceRef="subflow_usertask" targetRef="subflow_end" /> <userTask id="subflow_usertask" name="Decision" camunda:candidateUsers="${variables.get('assignee')}" /> </subProcess> <sequenceFlow id="s3" sourceRef="subflow" targetRef="end" /> </process> </definitions>
Um Prozessvariablen aus dem Geltungsbereich der Multi-Instanz heraus in den Geltungsbereich des gesamten Prozesses zu schreiben, müssen Sie dem Subprozess einen Schritt vom Typ bpmn:serviceTask hinzufügen.
... <subProcess id="subflow"> ... <sequenceFlow id="s2-3" sourceRef="writeDecision" targetRef="subflow_end" /> <serviceTask id="writeDecision" name="Write decision to global scope" camunda:asyncBefore="true" camunda:asyncAfter="true" camunda:delegateExpression="${writeMultiInstanceVariables}"> <extensionElements> ... <camunda:inputOutput> <camunda:inputParameter name="allDecisions">${variables.get('decision')}</camunda:inputParameter> </camunda:inputOutput> </extensionElements> </serviceTask> </subProcess> ...
Erläuterung der Eigenschaften
id: Die Eigenschaft wird als eindeutiger Bezeichner für die Sendenaktivität verwendet.
name: Die Eigenschaft wird als Anzeigename in den Benutzeroberflächen verwendet.
camunda:*: Diese Eigenschaften beinhalten technische Informationen, die zur Ausführung benötigt werden. Bei Schritten zum Schreiben von Variablen aus einer Multi-Instanz in den Prozess müssen Sie für diese Eigenschaften immer die Werte des Beispiels eintragen.
Im Bereich camunda:inputOutput müssen Sie nun für jede Variable, für die Sie im Geltungsbereich des Prozesses einen Wert einfügen wollen, ein Element vom Typ camunda:inputParameter definieren. Die Eigenschaft name muss in diesem Fall dem Namen der Prozessvariablen entsprechen, in die geschrieben werden soll. Der Inhalt dieses Elements definiert den Wert, der geschrieben wird. Hier können Sie wie gewohnt auch auf Variablen (des Geltungsbereichs der Multi-Instanz oder auch des Gesamtprozesses) zugreifen.
Prozessvariablen, die auf diese Weise geschrieben werden, müssen immer vom Typ Mehrfachwert sein. Der Index, an den eine Instanz des Multi-Instanz-Subprozesses schreibt, wird durch den automatisch zugewiesenen Wert der Variablen loopCounter bestimmt.
Anmerkung
allAssignees hat die Werte ['user1', 'user2', 'user3']. Dadurch entstehen insgesamt drei Instanzen des Multi-Instanz-Subprozesses mit den folgenden (hier relevanten) Variablen:
Instanz 1:
assignee: 'user1'
loopCounter: 0
Instanz 2:
assignee: 'user2'
loopCounter: 1
Instanz 3:
assignee: 'user3'
loopCounter: 2
Würde nun user2 in Instanz 2 die Benutzeraufgabe mit dem Wert 'myDecision' für decision abschließen und im folgenden Schritt die Variable allDecisions schreiben, hätte diese im Anschluss folgende Werte:
allDecisions: [null, 'myDecision', null]
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:
<?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" targetNamespace="" exporter="d.velop process modeler"> <process id="writeMultiInstanceVariables" name="WriteMultiInstanceVariables" isExecutable="true"> <extensionElements> <camunda:properties> <camunda:property name="variable:allAssignees*" value="[Identity]!" /> <camunda:property name="variable:assignee" value="Identity" /> <camunda:property name="variable:decision" value="String" /> <camunda:property name="variable:allDecisions" value="[String]" /> </camunda:properties> </extensionElements> <startEvent id="start" /> <endEvent id="end" /> <sequenceFlow id="s1" sourceRef="start" targetRef="subflow" /> <subProcess id="subflow"> <multiInstanceLoopCharacteristics camunda:collection="${variables.get('allAssignees')}" camunda:elementVariable="assignee" /> <startEvent id="subflow_start" /> <sequenceFlow id="s2-1" sourceRef="subflow_start" targetRef="subflow_usertask" /> <endEvent id="subflow_end" /> <sequenceFlow id="s2-2" sourceRef="subflow_usertask" targetRef="writeDecision" /> <userTask id="subflow_usertask" name="Decision" camunda:candidateUsers="${variables.get('assignee')}" /> <sequenceFlow id="s2-3" sourceRef="writeDecision" targetRef="subflow_end" /> <serviceTask id="writeDecision" name="Write decision to global scope" camunda:asyncBefore="true" camunda:asyncAfter="true" camunda:delegateExpression="${writeMultiInstanceVariables}"> <extensionElements> <camunda:failedJobRetryTimeCycle>R3/PT5M</camunda:failedJobRetryTimeCycle> <camunda:inputOutput> <camunda:inputParameter name="allDecisions">${variables.get('decision')}</camunda:inputParameter> </camunda:inputOutput> </extensionElements> </serviceTask> </subProcess> <sequenceFlow id="s3" sourceRef="subflow" targetRef="end" /> </process> <bpmndi:BPMNDiagram id="BPMNDiagram_1"> <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="writeMultiInstanceVariables"> <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="start"> <dc:Bounds x="179" y="159" width="36" height="36" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape id="Event_0ssel47_di" bpmnElement="end"> <dc:Bounds x="912" y="159" width="36" height="36" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape id="Activity_0li7yi3_di" bpmnElement="subflow" isExpanded="true"> <dc:Bounds x="300" y="77" width="490" height="200" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape id="Event_0ybst54_di" bpmnElement="subflow_start"> <dc:Bounds x="340" y="159" width="36" height="36" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape id="Event_0f9450b_di" bpmnElement="subflow_end"> <dc:Bounds x="712" y="159" width="36" height="36" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape id="Activity_1qx66xt_di" bpmnElement="subflow_usertask"> <dc:Bounds x="430" y="137" width="100" height="80" /> <bpmndi:BPMNLabel /> </bpmndi:BPMNShape> <bpmndi:BPMNShape id="Activity_13t76uu_di" bpmnElement="writeDecision"> <dc:Bounds x="570" y="137" width="100" height="80" /> </bpmndi:BPMNShape> <bpmndi:BPMNEdge id="Flow_146y71c_di" bpmnElement="s2-1"> <di:waypoint x="376" y="177" /> <di:waypoint x="430" y="177" /> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge id="Flow_1yq9qcz_di" bpmnElement="s2-2"> <di:waypoint x="530" y="177" /> <di:waypoint x="570" y="177" /> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge id="Flow_1huut97_di" bpmnElement="s2-3"> <di:waypoint x="670" y="177" /> <di:waypoint x="712" y="177" /> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge id="Flow_1o99dar_di" bpmnElement="s1"> <di:waypoint x="215" y="177" /> <di:waypoint x="300" y="177" /> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge id="Flow_13w0opv_di" bpmnElement="s3"> <di:waypoint x="790" y="177" /> <di:waypoint x="912" y="177" /> </bpmndi:BPMNEdge> </bpmndi:BPMNPlane> </bpmndi:BPMNDiagram> </definitions>