Menü der Dokumentation

Verwenden von Eskalationen

Beim Modellieren eigener Prozesse können Sie Eskalationen verwenden, um den Prozessablauf zu beeinflussen. Zum Einstieg in das Arbeiten mit Eskalationen ist es hilfreich, wenn Sie zunächst einen einfachen Prozess mit einer Benutzeraktivität und einem Timer-Ereignis erstellen. Dieser Prozess sieht beispielsweise so aus:

image2019-9-12_10-46-51.png

Das BPMN-Modell dieses beispielhaften Prozesses ist folgendermaßen aufgebaut:

<definitions xmlns="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="escalation_process" name="Escalation Process" isExecutable="true">
    <startEvent id="start" />
    <userTask id="task_hello_world" name="Hello World" camunda:candidateUsers="${variables.get('dv_initiator')}" />  
    <boundaryEvent id="timer" attachedToRef="task_hello_world">
      <timerEventDefinition>
        <timeDuration>PT1M</timeDuration>
      </timerEventDefinition>
    </boundaryEvent>
    <endEvent id="end" />
    <sequenceFlow id="s1" sourceRef="start" targetRef="task_hello_world" />
    <sequenceFlow id="s2" sourceRef="task_hello_world" targetRef="end" />
    <sequenceFlow id="s3" sourceRef="timer" targetRef="end" />
  </process>
</definitions>

Der Beispielprozess soll nun so angepasst werden, dass beim Eintritt des Timer-Ereignisses eine Eskalation ausgelöst wird. Die Eskalation startet dann einen Subprozess, der den Eskalationspfad beschreibt. Für diese Anpassung erzeugen Sie zunächst ein Eskalationsobjekt.

Hinzufügen eines Eskalationsobjektes

Fügen Sie dem Prozess zunächst das BPMN-Element escalation hinzu.

...
<definitions ...>
  <process id="escalation_process" name="Escalation Process" isExecutable="true">
    ...
  </process>
  <escalation id="time_escalation" name="Time Escalation" escalationCode="123" />
</definitions>

Erläuterung der Eigenschaften:

  • id:Die Eigenschaft wird als eindeutiger Bezeichner für die Eskalation verwendet.

  • name: Der Anzeigename der Eskalation.

  • escalationCode: Die Eigenschaft definiert einen technischen Code, der von den auf Eskalationen wartende Elementen verwendet werden kann, um die auslösende Eskalation zu identifizieren.

Nun kann die Eskalation im BPMN-Element IntermediateThrowEvent oder einem EndEvent verwendet werden, um ein entsprechendes Eskalationsereignis auszulösen.

Hinzufügen eines Eskalationsereignisses

Fügen Sie dem Prozess zunächst das BPMN-Element IntermediateThrowEvent mit einem EscalationEventDefinition-Element hinzu. Anschließend ändern Sie das Ziel des Sequenzflusses s3 von end nach throw_time_escalation und fügen einen neuen Sequenzfluss s4 von throw_time_escalation nach end hinzu.

...
<process id="escalation_process" name="Escalation Process" isExecutable="true">
  ...
  <intermediateThrowEvent id="throw_time_escalation">
    <escalationEventDefinition escalationRef="time_escalation" />
  </intermediateThrowEvent>
  <endEvent id="end" />
  ...
  <sequenceFlow id="s3" sourceRef="timer" targetRef="throw_time_escalation" />
  <sequenceFlow id="s4" sourceRef="throw_time_escalation" targetRef="end" />
</process>
<escalation id="time_escalation" name="Time Escalation" escalationCode="123" />
...

Der Prozess sieht nun wie folgt aus:

image2019-9-12_11-5-3.png

Hinzufügen eines Eskalationspfades

Fügen Sie nun einen Subprozess hinzu, dessen BPMN-Element StartEvent das Element EscalationEventDefinition beinhaltet.

...
<process id="escalation_process" name="Escalation Process" isExecutable="true">
  <extensionElements>
    <camunda:properties>
      <camunda:property name="variable:escalationCode" value="String" />
    </camunda:properties>
  </extensionElements>
  <startEvent id="start" />
  ...
  <sequenceFlow id="s4" sourceRef="throw_time_escalation" targetRef="end" />
  <subProcess id="escalation_subprocess" name="Escalation Process" triggeredByEvent="true">
    <startEvent id="sub_start" isInterrupting="false">
      <escalationEventDefinition escalationRef="time_escalation" camunda:escalationCodeVariable="escalationCode" />
    </startEvent>
    <endEvent id="sub_end" />
    <sequenceFlow id="sub_s1" sourceRef="sub_start" targetRef="sub_end" />
  </subProcess>
</process> 
<escalation id="time_escalation" name="Time Escalation" escalationCode="123" />
...

Erläuterung der Eigenschaften:

  • subProcess

    • triggeredByEvent: muss den Wert true enthalten. Die Eigenschaft gibt an, dass das Start-Ereignis dieses Subprozesses durch ein Ereignis ausgelöst wird (in diesem Fall ein Eskalationsereignis).

    • isInterrupting: wenn true, dann wird der Prozesszweig, der die Eskalation ausgelöst hat, abgebrochen. Wenn false, dann läuft dieser Prozesszweig parallel weiter.

  • escalationEventDefinition

    • escalationRef: Enthält die ID der Eskalation, anhand derer dieses Ereignis ausgelöst werden soll.

    • camunda:escalationCodeVariable: (Optional) Name der Variablen, in die der Wert von escalationCode der aufgetretenen Eskalation gespeichert wird (Variable muss definiert sein).

Bitte beachten Sie, dass Sie bei Verwendung der Eigenschaft camunda:escalationCodeVariable auch eine Definition der entsprechenden Prozessvariablen im Hauptprozess hinzufügen müssen.

Fügen Sie dem Eskalationspfad nun noch eine Benutzeraktivität hinzu, die im Falle einer Eskalation durchlaufen werden soll.

...
<process id="escalation_process" name="Escalation Process" isExecutable="true">
  ...
  <subProcess id="escalation_subprocess" name="Escalation Process" triggeredByEvent="true">
    <startEvent id="sub_start" isInterrupting="false">
      <escalationEventDefinition escalationRef="time_escalation" camunda:escalationCodeVariable="escalationCode" />
    </startEvent>       
        <userTask id="sub_task_escalation" name="Escalation occurred" camunda:candidateUsers="${variables.get('dv_initiator')}" />
    <endEvent id="sub_end" />
    <sequenceFlow id="sub_s1" sourceRef="sub_start" targetRef="sub_task_escalation" />
    <sequenceFlow id="sub_s2" sourceRef="sub_task_escalation" targetRef="sub_end" />
  </subProcess>
</process> 
<escalation id="time_escalation" name="Time Escalation" escalationCode="123" />
...

Zur Vereinfachung wird in diesem Beispiel als Empfänger der Benutzeraktivität des Eskalationspfades der Benutzer eingetragen, der den Prozess gestartet hat.

Der finale Prozess sieht wie folgt aus:

image2019-9-12_12-13-44.png

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.

<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="escalation_process" name="Escalation Process" isExecutable="true">
    <extensionElements>
      <camunda:properties>
        <camunda:property name="variable:escalationCode" value="String" />
      </camunda:properties>
    </extensionElements>

    <startEvent id="start" />
    <userTask id="task_hello_world" name="Hello World" camunda:candidateUsers="${variables.get('dv_initiator')}" />    
    <boundaryEvent id="timer" attachedToRef="task_hello_world">
      <timerEventDefinition>
        <timeDuration>PT1M</timeDuration>
      </timerEventDefinition>
    </boundaryEvent>
    <intermediateThrowEvent id="throw_time_escalation">
      <escalationEventDefinition escalationRef="time_escalation" />
    </intermediateThrowEvent>
    <endEvent id="end" />

    <sequenceFlow id="s1" sourceRef="start" targetRef="task_hello_world" />
    <sequenceFlow id="s2" sourceRef="task_hello_world" targetRef="end" />
    <sequenceFlow id="s3" sourceRef="timer" targetRef="throw_time_escalation" />
    <sequenceFlow id="s4" sourceRef="throw_time_escalation" targetRef="end" />

    <subProcess id="escalation_subprocess" name="Escalation Process" triggeredByEvent="true">
      <startEvent id="sub_start" isInterrupting="false">
        <escalationEventDefinition escalationRef="time_escalation" camunda:escalationCodeVariable="escalationCode" />
      </startEvent>
      <userTask id="sub_task_escalation" name="Escalation occurred" camunda:candidateUsers="${variables.get('dv_initiator')}" />
      <endEvent id="sub_end" />
      <sequenceFlow id="sub_s1" sourceRef="sub_start" targetRef="sub_task_escalation" />
      <sequenceFlow id="sub_s2" sourceRef="sub_task_escalation" targetRef="sub_end" />
    </subProcess>

  </process>
  <escalation id="time_escalation" name="Time Escalation" escalationCode="123" />

  <!-- Diagram information -->
  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="escalation_process">
      <bpmndi:BPMNShape id="start_di" bpmnElement="start">
        <dc:Bounds x="179" y="99" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="task_hello_world_di" bpmnElement="task_hello_world">
        <dc:Bounds x="290" y="77" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="timer_di" bpmnElement="timer">
        <dc:Bounds x="372" y="139" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="throw_time_escalation_di" bpmnElement="throw_time_escalation">
        <dc:Bounds x="432" y="202" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="end_di" bpmnElement="end">
        <dc:Bounds x="492" y="99" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="s1_di" bpmnElement="s1">
        <di:waypoint x="215" y="117" />
        <di:waypoint x="290" y="117" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="s2_di" bpmnElement="s2">
        <di:waypoint x="390" y="117" />
        <di:waypoint x="492" y="117" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="s3_di" bpmnElement="s3">
        <di:waypoint x="390" y="175" />
        <di:waypoint x="390" y="220" />
        <di:waypoint x="432" y="220" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="s4_di" bpmnElement="s4">
        <di:waypoint x="468" y="220" />
        <di:waypoint x="510" y="220" />
        <di:waypoint x="510" y="135" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="escalation_subprocess_di" bpmnElement="escalation_subprocess" isExpanded="true">
        <dc:Bounds x="165" y="290" width="350" height="200" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="sub_start_di" bpmnElement="sub_start">
        <dc:Bounds x="205" y="372" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="sub_task_escalation_di" bpmnElement="sub_task_escalation">
        <dc:Bounds x="290" y="350" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="sub_end_di" bpmnElement="sub_end">
        <dc:Bounds x="442" y="372" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="sub_s1_di" bpmnElement="sub_s1">
        <di:waypoint x="241" y="390" />
        <di:waypoint x="290" y="390" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="sub_s2_di" bpmnElement="sub_s2">
        <di:waypoint x="390" y="390" />
        <di:waypoint x="442" y="390" />
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>