Skip to content

Intermediate Event

An intermediate event is an event placed in the middle of a process, not at its start or end. For the general idea of events, see the article BPMN Event.

Throwing and catching

The inner icon shows the direction. A throwing event has an icon filled with black. A catching event has a white, unfilled icon.

  • A throwing event fires a trigger when execution reaches it.
  • A catching event waits for a trigger when execution reaches it.

Message events follow the same rule. The message catch icon is white to show that it catches.

What waiting means

A catching event stops the token until the awaited event occurs. The token marks where the process instance currently is. For a message, the engine creates a subscription. The instance then waits until the message is correlated, meaning matched to it.

Waiting for several messages

To wait for several messages and merge them, combine receive tasks with a parallel gateway. A receive task is a task that waits for a message.

Where an event sits

An intermediate event can sit in the normal sequence flow. It can also sit on the edge of an activity that it may interrupt. Then it is a boundary event. Boundary events always catch and never throw. See the article Boundary Event.

Which types can catch or throw

Some types are restricted:

  • Timer and conditional events can only catch.
  • Link events are used only as intermediate events. See the article Link Event.
  • A catching error event must be attached to an activity.

Waiting for one of several events

An event-based gateway routes by which event happens next, not by data. The instance waits at the gateway until one event triggers. Then the others can no longer fire. See the article Event-Based Gateway.

A process sends an order confirmation, then waits for the customer’s payment message. The send step is a throwing message event with a filled envelope. The wait step is a catching message event with a white envelope. The token stays at the white envelope until the payment message arrives. Then the process continues.

A process throws a message, then waits at a catching message event.

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.com/bpmn">
<message id="msgConfirm" name="Order confirmation" />
<message id="msgPayment" name="Payment" />
<process id="p1" isExecutable="false">
<startEvent id="s" name="Order received">
<outgoing>f1</outgoing>
</startEvent>
<intermediateThrowEvent id="t" name="Send confirmation">
<incoming>f1</incoming>
<outgoing>f2</outgoing>
<messageEventDefinition messageRef="msgConfirm" />
</intermediateThrowEvent>
<intermediateCatchEvent id="c" name="Payment received">
<incoming>f2</incoming>
<outgoing>f3</outgoing>
<messageEventDefinition messageRef="msgPayment" />
</intermediateCatchEvent>
<endEvent id="e" name="Order paid">
<incoming>f3</incoming>
</endEvent>
<sequenceFlow id="f1" sourceRef="s" targetRef="t" />
<sequenceFlow id="f2" sourceRef="t" targetRef="c" />
<sequenceFlow id="f3" sourceRef="c" targetRef="e" />
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_p1">
<bpmndi:BPMNPlane id="BPMNPlane_p1" bpmnElement="p1">
<bpmndi:BPMNShape id="BPMNShape_s" bpmnElement="s">
<dc:Bounds x="80" y="80" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="68" y="121" width="60" height="28" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_t" bpmnElement="t">
<dc:Bounds x="216" y="80" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="192" y="121" width="84" height="42" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_c" bpmnElement="c">
<dc:Bounds x="352" y="80" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="340" y="121" width="60" height="28" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_e" bpmnElement="e">
<dc:Bounds x="488" y="80" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="470" y="121" width="73" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="BPMNEdge_f1" bpmnElement="f1">
<di:waypoint x="116" y="98" />
<di:waypoint x="216" y="98" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_f2" bpmnElement="f2">
<di:waypoint x="252" y="98" />
<di:waypoint x="352" y="98" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_f3" bpmnElement="f3">
<di:waypoint x="388" y="98" />
<di:waypoint x="488" y="98" />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
  • Catching events use an unfilled icon and throwing events use a filled icon, consistently across the diagrams.
  • Boundary events are modeled only as catching events.
  • Timer and conditional events are modeled as catching events only.
  • Waiting for several messages uses receive tasks combined with a parallel gateway.