Skip to content

Process Model versus Process Instance

A process model is the drawing of a business process. Once deployed to a process engine and versioned, it is called a process definition. You use it to start instances.

A process instance is one execution of that definition. Each instance has its own unique key.

A token shows where an instance currently is. You can picture execution as tokens running through the model. A token marks the current point of execution. When the token reaches the end of the process, it is consumed and the instance ends.

Gateways decide which path a token takes. Gateways are the diamond-shaped elements that split the flow (see the article BPMN Gateway):

  • An exclusive gateway picks one outgoing sequence flow based on data.
  • A parallel gateway creates new tokens by activating several sequence flows at once.

So one instance can hold several tokens at the same time.

Correlation links an incoming message to the right running instance. The message carries an attribute that is matched against a variable of the instance. A correlation key is required when you publish a message. A payment, for example, must reach the right waiting instance.

A company models a “handle complaint” process once and deploys it. Monday’s complaint from customer A starts instance 1. Tuesday’s complaint from customer B starts instance 2. Each instance has its own key and its own token.

In instance 1, an exclusive gateway sends the token to “refund”. In instance 2, the same gateway sends it to “replace item”. The model is the same, but each instance takes a different path.

Later, a message “customer replied” arrives. Its correlation attribute, such as a complaint number, tells the engine which waiting instance should receive it.

One model: an exclusive gateway picks one path per instance, then a parallel gateway creates two tokens.

Diagram source
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="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:di="http://www.omg.org/spec/DD/20100524/DI" targetNamespace="http://example.org/bpmn">
<process id="complaint" isExecutable="false">
<startEvent id="start" name="Complaint received">
<outgoing>f1</outgoing>
</startEvent>
<exclusiveGateway id="xor" name="Refund or replace?">
<incoming>f1</incoming>
<outgoing>f2</outgoing>
<outgoing>f3</outgoing>
</exclusiveGateway>
<task id="refund" name="Refund">
<incoming>f2</incoming>
<outgoing>f4</outgoing>
</task>
<task id="replace" name="Replace item">
<incoming>f3</incoming>
<outgoing>f5</outgoing>
</task>
<exclusiveGateway id="xorJoin">
<incoming>f4</incoming>
<incoming>f5</incoming>
<outgoing>f6</outgoing>
</exclusiveGateway>
<parallelGateway id="andSplit">
<incoming>f6</incoming>
<outgoing>f7</outgoing>
<outgoing>f8</outgoing>
</parallelGateway>
<task id="notify" name="Notify customer">
<incoming>f7</incoming>
<outgoing>f9</outgoing>
</task>
<task id="log" name="Update records">
<incoming>f8</incoming>
<outgoing>f10</outgoing>
</task>
<parallelGateway id="andJoin">
<incoming>f9</incoming>
<incoming>f10</incoming>
<outgoing>f11</outgoing>
</parallelGateway>
<endEvent id="end" name="Complaint closed">
<incoming>f11</incoming>
</endEvent>
<sequenceFlow id="f1" sourceRef="start" targetRef="xor" />
<sequenceFlow id="f2" sourceRef="xor" targetRef="refund" />
<sequenceFlow id="f3" sourceRef="xor" targetRef="replace" />
<sequenceFlow id="f4" sourceRef="refund" targetRef="xorJoin" />
<sequenceFlow id="f5" sourceRef="replace" targetRef="xorJoin" />
<sequenceFlow id="f6" sourceRef="xorJoin" targetRef="andSplit" />
<sequenceFlow id="f7" sourceRef="andSplit" targetRef="notify" />
<sequenceFlow id="f8" sourceRef="andSplit" targetRef="log" />
<sequenceFlow id="f9" sourceRef="notify" targetRef="andJoin" />
<sequenceFlow id="f10" sourceRef="log" targetRef="andJoin" />
<sequenceFlow id="f11" sourceRef="andJoin" targetRef="end" />
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_complaint">
<bpmndi:BPMNPlane id="BPMNPlane_complaint" bpmnElement="complaint">
<bpmndi:BPMNShape id="BPMNShape_start" bpmnElement="start">
<dc:Bounds x="80" y="102" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="62" y="143" width="72" height="28" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_xor" bpmnElement="xor" isMarkerVisible="true">
<dc:Bounds x="216" y="95" width="50" height="50" />
<bpmndi:BPMNLabel>
<dc:Bounds x="208" y="62" width="66" height="28" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_refund" bpmnElement="refund">
<dc:Bounds x="366" y="80" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_replace" bpmnElement="replace">
<dc:Bounds x="366" y="240" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_xorJoin" bpmnElement="xorJoin" isMarkerVisible="true">
<dc:Bounds x="566" y="95" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_andSplit" bpmnElement="andSplit" isMarkerVisible="true">
<dc:Bounds x="716" y="95" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_notify" bpmnElement="notify">
<dc:Bounds x="866" y="80" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_log" bpmnElement="log">
<dc:Bounds x="866" y="240" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_andJoin" bpmnElement="andJoin" isMarkerVisible="true">
<dc:Bounds x="1066" y="95" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_end" bpmnElement="end">
<dc:Bounds x="1216" y="102" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1198" y="143" width="72" height="28" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="BPMNEdge_f1" bpmnElement="f1">
<di:waypoint x="116" y="120" />
<di:waypoint x="216" y="120" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_f2" bpmnElement="f2">
<di:waypoint x="266" y="120" />
<di:waypoint x="366" y="120" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_f4" bpmnElement="f4">
<di:waypoint x="466" y="120" />
<di:waypoint x="566" y="120" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_f6" bpmnElement="f6">
<di:waypoint x="616" y="120" />
<di:waypoint x="716" y="120" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_f7" bpmnElement="f7">
<di:waypoint x="766" y="120" />
<di:waypoint x="866" y="120" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_f9" bpmnElement="f9">
<di:waypoint x="966" y="120" />
<di:waypoint x="1066" y="120" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_f11" bpmnElement="f11">
<di:waypoint x="1116" y="120" />
<di:waypoint x="1216" y="120" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_f3" bpmnElement="f3">
<di:waypoint x="241" y="145" />
<di:waypoint x="241" y="280" />
<di:waypoint x="366" y="280" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_f8" bpmnElement="f8">
<di:waypoint x="741" y="145" />
<di:waypoint x="741" y="280" />
<di:waypoint x="866" y="280" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_f5" bpmnElement="f5">
<di:waypoint x="466" y="280" />
<di:waypoint x="591" y="280" />
<di:waypoint x="591" y="145" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_f10" bpmnElement="f10">
<di:waypoint x="966" y="280" />
<di:waypoint x="1091" y="280" />
<di:waypoint x="1091" y="145" />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
  • The document states that a model is deployed as a versioned process definition from which instances are started.
  • Each message a process waits for names the attribute used to correlate it to the right waiting instance.
  • Parallel gateways are used where several paths must run at once, and exclusive gateways where data selects one path.