Skip to content

Boundary Event

A boundary event sits on the edge of a task or subprocess. It watches for something to happen while that activity runs. (See the articles “BPMN Activity” and “BPMN Event” for the basics.)

The event can be interrupting or non-interrupting. An interrupting event ends the activity when it fires. A non-interrupting event does not end the activity.

Timer boundary events

  • An interrupting timer ends the activity when the timer fires. Modelers often use it for timeouts.
  • A non-interrupting timer is often used for notifications, such as reminders. The timer starts when the activity is entered.

Error boundary events

An error boundary event is always interrupting. The task is terminated and the flow leaves the regular path.

Escalation boundary events

An escalation is not an error. It is non-critical, and execution continues where it was thrown. Only one catch event handles an escalation: the one in the nearest parent flow scope. That catch event can be a boundary event or an event subprocess. An escalation boundary event can optionally be interrupting. In that case it ends the scope it is attached to.

A “Review application” task has two timer boundary events. A non-interrupting timer sends a reminder to the reviewer when the task has been open for a while. The task keeps running. An interrupting timer fires later and cancels the review. The flow then follows a path that handles the timeout.

Interrupting or non-interrupting changes what happens to the running work. An interrupting event ends the activity. A non-interrupting event leaves it running. Escalations can be either, so the modeler must choose. Errors give no such choice: they always interrupt.

A review task with a non-interrupting reminder timer and an interrupting timeout timer.

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">
<process id="p1" isExecutable="false">
<startEvent id="start" name="Application received">
<outgoing>f1</outgoing>
</startEvent>
<userTask id="review" name="Review application">
<incoming>f1</incoming>
<outgoing>f2</outgoing>
</userTask>
<boundaryEvent id="reminder" name="After 1 day" cancelActivity="false" attachedToRef="review">
<outgoing>f3</outgoing>
<timerEventDefinition />
</boundaryEvent>
<boundaryEvent id="timeout" name="After 2 days" attachedToRef="review">
<outgoing>f5</outgoing>
<timerEventDefinition />
</boundaryEvent>
<sendTask id="remind" name="Send reminder">
<incoming>f3</incoming>
<outgoing>f4</outgoing>
</sendTask>
<task id="cancel" name="Cancel review">
<incoming>f5</incoming>
<outgoing>f6</outgoing>
</task>
<endEvent id="endOk" name="Reviewed">
<incoming>f2</incoming>
</endEvent>
<endEvent id="endRem" name="Reminder sent">
<incoming>f4</incoming>
</endEvent>
<endEvent id="endTimeout" name="Timed out">
<incoming>f6</incoming>
</endEvent>
<sequenceFlow id="f1" sourceRef="start" targetRef="review" />
<sequenceFlow id="f2" sourceRef="review" targetRef="endOk" />
<sequenceFlow id="f3" sourceRef="reminder" targetRef="remind" />
<sequenceFlow id="f4" sourceRef="remind" targetRef="endRem" />
<sequenceFlow id="f5" sourceRef="timeout" targetRef="cancel" />
<sequenceFlow id="f6" sourceRef="cancel" targetRef="endTimeout" />
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_p1">
<bpmndi:BPMNPlane id="BPMNPlane_p1" bpmnElement="p1">
<bpmndi:BPMNShape id="BPMNShape_start" bpmnElement="start">
<dc:Bounds x="80" y="102" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="57" y="143" width="83" height="28" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_review" bpmnElement="review">
<dc:Bounds x="216" y="80" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_remind" bpmnElement="remind">
<dc:Bounds x="416" y="400" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_cancel" bpmnElement="cancel">
<dc:Bounds x="416" y="240" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_endOk" bpmnElement="endOk">
<dc:Bounds x="448" y="102" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="434" y="143" width="65" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_endRem" bpmnElement="endRem">
<dc:Bounds x="616" y="422" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="602" y="463" width="65" height="28" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_endTimeout" bpmnElement="endTimeout">
<dc:Bounds x="616" y="262" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="600" y="303" width="69" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_reminder" bpmnElement="reminder">
<dc:Bounds x="226" y="142" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="146" y="183" width="77" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_timeout" bpmnElement="timeout">
<dc:Bounds x="270" y="142" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="306" y="183" width="84" height="14" />
</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="316" y="120" />
<di:waypoint x="448" y="120" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_f4" bpmnElement="f4">
<di:waypoint x="516" y="440" />
<di:waypoint x="616" y="440" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_f6" bpmnElement="f6">
<di:waypoint x="516" y="280" />
<di:waypoint x="616" y="280" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_f3" bpmnElement="f3">
<di:waypoint x="244" y="178" />
<di:waypoint x="244" y="440" />
<di:waypoint x="416" y="440" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_f5" bpmnElement="f5">
<di:waypoint x="288" y="178" />
<di:waypoint x="288" y="280" />
<di:waypoint x="416" y="280" />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
  • Error boundary events in the model are interrupting.
  • Timeouts are modeled with interrupting timer boundary events, and reminders with non-interrupting ones.
  • Escalations are handled by a catch event in the nearest parent flow scope.
  • Escalation is not modeled as an error, and any interrupting escalation boundary event is a deliberate choice.