Wat is een gateway?
Definitie
Een gateway is een BPMN element waarmee de workflow zich kan vertakken in meerdere flows, of waarmee meerdere flows kunnen worden samengevoegd tot één flow. Afhankelijk van het gewenste gedrag kun je verschillende gateway types hebben die je kunt configureren met behulp van gateway eigenschappen.
Symbool
Een gateway wordt weergegeven door een ruit.
Visuele voorbeelden
Met gateways kun je veel verschillende scenario's modelleren. Hieronder vind je alvast enkele eenvoudige voorbeelden. Zie de overige pagina’s in deze sectie voor meer info over types en eigenschappen.
Voorbeeld met exclusive gateway
In de workflow hieronder zorgt de eerste gateway ervoor dat de workflow vertakt. Op deze manier kunnen twee verschillende voortzettingen worden gemodelleerd. Omgekeerd voegt de tweede gateway de twee flows weer samen tot één vervolg. Hier zijn exclusive gateways gebruikt: slechts één van beide paden kan worden geactiveerd.
Voorbeeld met parallel gateway
De workflow hieronder lijkt erg op die hierboven, maar hier worden parallelle gateways gebruikt. Dit betekent dat beide paden tegelijkertijd worden geactiveerd. Bij de vertakkende gateway wordt de process token opgesplitst in twee onderling gelinkte tokens. Deze wachten op elkaar bij de tweede gateway. Daar worden de twee process tokens weer samengevoegd tot één token en gaat het proces verder.
Voorbeeld met inclusive gateway (1)
De workflow hieronder maakt gebruik van een inclusive gateway. Dit betekent dat één of meer paden worden geactiveerd afhankelijk van condities die zijn geconfigureerd. De inkomende process token kan worden gesplitst in meerdere aan elkaar gelinkte tokens. Het proces zal alleen eindigen als al deze tokens geconsumeerd zijn binnen een end event. Merk op dat de derde uitgaande flow is gemarkeerd als default. Dit betekent dat als geen enkele van de twee andere flows wordt geactiveerd, de process token dit pad zal volgen.
Voorbeeld met inclusive gateway (2)
Bij een inclusive gateway worden potentieel één of meerdere uitgaande vertakkingen geactiveerd. Indien je deze uitgaande vertakkingen achteraf opnieuw wil mergen, mag je daarbij geen gebruik maken van een exclusive gateway. Deze weet immers niet op hoeveel onderling gelinkte tokens het moet wachten. De oplossing is om het volledige inclusive gateway patroon in een embedded subprocess onder te brengen. Het subproces sluit pas af indien alle onderling gelinkte tokens een end event binnen dat subproces hebben bereikt. Vervolgens gaat er één token verder in het resterend deel van de workflow.
Voorbeeld met event based gateway
De workflow hieronder maakt gebruik van een event based gateway. De process token wacht in de gateway tot één van beide uitgaande flows getriggerd wordt door een intermediate catch event. In het voorbeelddiagram zie je twee typische intermediate catch events, namelijk een timer (na 20 dagen) en een inkomend message (een freelancer reageert op een gepubliceerde opracht). De process token gaat enkel door in de geactiveerde flow. De andere flow wordt verder genegeerd.
XML voorbeelden
XML-sample met exclusive gateway
Exclusive gateway met één incoming flow en twee outgoing flows.
<bpmn:exclusiveGateway id="Gateway_1j8ci2p" default="Flow_0cz25wr">
<bpmn:incoming>Flow_18qmelc</bpmn:incoming>
<bpmn:outgoing>Flow_0cz25wr</bpmn:outgoing>
<bpmn:outgoing>Flow_1mp2neh</bpmn:outgoing>
</bpmn:exclusiveGateway>
Volledige BPMN:
Gemodelleerd met dummy taken
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_10ft502" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.7.3">
<bpmn:process id="mijnWorkflow" name="Mijn workflow" isExecutable="true">
<bpmn:extensionElements>
<camunda:properties>
<camunda:property name="description" value="" />
</camunda:properties>
</bpmn:extensionElements>
<bpmn:startEvent id="StartEvent_1" name="Beslissing opgestart">
<bpmn:outgoing>Flow_0gnzi0z</bpmn:outgoing>
</bpmn:startEvent>
<bpmn:exclusiveGateway id="Gateway_1j8ci2p" default="Flow_0cz25wr">
<bpmn:incoming>Flow_18qmelc</bpmn:incoming>
<bpmn:outgoing>Flow_0cz25wr</bpmn:outgoing>
<bpmn:outgoing>Flow_1mp2neh</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:sequenceFlow id="Flow_0gnzi0z" sourceRef="StartEvent_1" targetRef="Activity_16ykldq" />
<bpmn:manualTask id="Activity_16ykldq" name="Beslis A of B">
<bpmn:incoming>Flow_0gnzi0z</bpmn:incoming>
<bpmn:outgoing>Flow_18qmelc</bpmn:outgoing>
</bpmn:manualTask>
<bpmn:sequenceFlow id="Flow_18qmelc" sourceRef="Activity_16ykldq" targetRef="Gateway_1j8ci2p" />
<bpmn:sequenceFlow id="Flow_0cz25wr" name="A" sourceRef="Gateway_1j8ci2p" targetRef="Activity_1fjklmr" />
<bpmn:manualTask id="Activity_1fjklmr" name="Doe A">
<bpmn:incoming>Flow_0cz25wr</bpmn:incoming>
<bpmn:outgoing>Flow_0buhpk7</bpmn:outgoing>
</bpmn:manualTask>
<bpmn:sequenceFlow id="Flow_1mp2neh" name="B" sourceRef="Gateway_1j8ci2p" targetRef="Activity_0s2ajjy">
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">${skryv.dossierFromScope(execution).getOrCreateDocumentByDefinitionKey("mijnFormulier").getField("belissing") == 'b'}</bpmn:conditionExpression>
</bpmn:sequenceFlow>
<bpmn:manualTask id="Activity_0s2ajjy" name="Doe B">
<bpmn:incoming>Flow_1mp2neh</bpmn:incoming>
<bpmn:outgoing>Flow_1jzrb5u</bpmn:outgoing>
</bpmn:manualTask>
<bpmn:exclusiveGateway id="Gateway_0i48qyv">
<bpmn:incoming>Flow_0buhpk7</bpmn:incoming>
<bpmn:incoming>Flow_1jzrb5u</bpmn:incoming>
<bpmn:outgoing>Flow_1qrzxxz</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:sequenceFlow id="Flow_0buhpk7" sourceRef="Activity_1fjklmr" targetRef="Gateway_0i48qyv" />
<bpmn:sequenceFlow id="Flow_1jzrb5u" sourceRef="Activity_0s2ajjy" targetRef="Gateway_0i48qyv" />
<bpmn:endEvent id="Event_1lxig2d" name="Beslissing afgerond">
<bpmn:incoming>Flow_1qrzxxz</bpmn:incoming>
</bpmn:endEvent>
<bpmn:sequenceFlow id="Flow_1qrzxxz" sourceRef="Gateway_0i48qyv" targetRef="Event_1lxig2d" />
</bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="mijnWorkflow">
<bpmndi:BPMNEdge id="Flow_0gnzi0z_di" bpmnElement="Flow_0gnzi0z">
<di:waypoint x="215" y="97" />
<di:waypoint x="260" y="97" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_18qmelc_di" bpmnElement="Flow_18qmelc">
<di:waypoint x="360" y="97" />
<di:waypoint x="415" y="97" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0cz25wr_di" bpmnElement="Flow_0cz25wr">
<di:waypoint x="440" y="72" />
<di:waypoint x="440" y="20" />
<di:waypoint x="510" y="20" />
<bpmndi:BPMNLabel>
<dc:Bounds x="451" y="43" width="8" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1mp2neh_di" bpmnElement="Flow_1mp2neh">
<di:waypoint x="440" y="122" />
<di:waypoint x="440" y="190" />
<di:waypoint x="510" y="190" />
<bpmndi:BPMNLabel>
<dc:Bounds x="451" y="153" width="8" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0buhpk7_di" bpmnElement="Flow_0buhpk7">
<di:waypoint x="610" y="20" />
<di:waypoint x="680" y="20" />
<di:waypoint x="680" y="72" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1jzrb5u_di" bpmnElement="Flow_1jzrb5u">
<di:waypoint x="610" y="190" />
<di:waypoint x="680" y="190" />
<di:waypoint x="680" y="122" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1qrzxxz_di" bpmnElement="Flow_1qrzxxz">
<di:waypoint x="705" y="97" />
<di:waypoint x="752" y="97" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
<dc:Bounds x="179" y="79" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="172" y="122" width="50" height="27" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_1j8ci2p_di" bpmnElement="Gateway_1j8ci2p" isMarkerVisible="true">
<dc:Bounds x="415" y="72" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1oknrpr_di" bpmnElement="Activity_16ykldq">
<dc:Bounds x="260" y="57" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_06i5kou_di" bpmnElement="Activity_1fjklmr">
<dc:Bounds x="510" y="-20" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0fa4up9_di" bpmnElement="Activity_0s2ajjy">
<dc:Bounds x="510" y="150" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_0i48qyv_di" bpmnElement="Gateway_0i48qyv" isMarkerVisible="true">
<dc:Bounds x="655" y="72" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_1lxig2d_di" bpmnElement="Event_1lxig2d">
<dc:Bounds x="752" y="79" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="745" y="122" width="50" height="27" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>





