Camunda定時器事件示例Demo(Timer Events)

我不是大肥虎發表於2022-06-13

Camunda定時器事件(Timer Events)是由定義的計時器觸發的事件。它們可以用作啟動事件、中間事件或邊界事件。邊界事件可以中斷,也可以不中斷。

Camunda定時器事件包括:Timer Start Event(定時啟動事件)、Timer Intermediate Catching Event(定時中間捕獲事件)、Timer Boundary Event(定時邊界事件)。

計時器啟動事件Timer Start Event用於在給定時間建立流程例項。它既可以用於應該只啟動一次的程式,也可以用於應該在特定時間間隔內啟動的程式。子流程不能有計時器啟動事件。一旦部署了流程,計時器啟動事件就會被排程。沒有必要呼叫startProcessInstanceBy…,儘管呼叫start程式方法是不受限制的,並且會導致在startProcessInstanceBy的時候再次啟動程式…呼叫。計時器開始事件的XML表示是普通的開始事件宣告,帶有計時器定義子元素。

計時器邊界事件Timer Boundary Event充當秒錶和鬧鐘。當執行到達附加邊界事件的活動時,計時器就會啟動。當計時器觸發時(例如,在指定的時間間隔之後),活動被中斷,然後序列流離開計時器邊界事件。中斷和非中斷計時器事件是有區別的。預設情況下為中斷事件。非中斷事件導致原來的活動不被中斷,該活動保持在那裡。相反,將建立一個額外的執行並在事件的傳出轉換中傳送。

本文重點介紹Timer Start Event(定時啟動事件)和Timer Boundary Event(定時邊界事件),其它事件請參考camunda官方文件:https://docs.camunda.org/manual/7.15/reference/bpmn20/events/

 

一、設計流程圖

 

 

計時器啟動事件Timer Start Event節點配置:

 

      <bpmn:timerEventDefinition id="TimerEventDefinition_14ilbim">

        <bpmn:timeCycle xsi:type="bpmn:tFormalExpression">R2/2022-02-11T09:07/PT1M</bpmn:timeCycle>

      </bpmn:timerEventDefinition>
Camunda定時器事件示例Demo(Timer Events)

表示流程將於2022年2月11日09:07(24小時制)開始,以1分鐘為間隔,共啟動2次。

 

計時器邊界事件Timer Boundary Event節點配置

Camunda定時器事件示例Demo(Timer Events)

 

      <bpmn:timerEventDefinition id="TimerEventDefinition_1epfipx">

        <bpmn:timeDuration xsi:type="bpmn:tFormalExpression">PT3M</bpmn:timeDuration>

      </bpmn:timerEventDefinition>
Camunda定時器事件示例Demo(Timer Events)

表示流程在任務一節點超時3分鐘未處理將自動流轉。

 

BPMN流程模型檔案:

<?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" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_1gaqb29" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="4.8.1" modeler:executionPlatform="Camunda Platform" modeler:executionPlatformVersion="7.15.0">

  <bpmn:process id="Process_1hroby5" name="定時器流程" isExecutable="true">

    <bpmn:sequenceFlow id="Flow_0w5epa1" sourceRef="StartEvent_1" targetRef="Activity_1bxm9f3" />

    <bpmn:sequenceFlow id="Flow_0rzgepj" sourceRef="Activity_1bxm9f3" targetRef="Activity_0wkolx8" />

    <bpmn:endEvent id="Event_1avte49">

      <bpmn:incoming>Flow_0a2yjox</bpmn:incoming>

    </bpmn:endEvent>

    <bpmn:sequenceFlow id="Flow_0a2yjox" sourceRef="Activity_0wkolx8" targetRef="Event_1avte49" />

    <bpmn:userTask id="Activity_1bxm9f3" name="任務一" camunda:assignee="demo">

      <bpmn:incoming>Flow_0w5epa1</bpmn:incoming>

      <bpmn:outgoing>Flow_0rzgepj</bpmn:outgoing>

    </bpmn:userTask>

    <bpmn:userTask id="Activity_0wkolx8" name="任務二" camunda:assignee="demo">

      <bpmn:incoming>Flow_0rzgepj</bpmn:incoming>

      <bpmn:incoming>Flow_0gb67p8</bpmn:incoming>

      <bpmn:outgoing>Flow_0a2yjox</bpmn:outgoing>

    </bpmn:userTask>

    <bpmn:startEvent id="StartEvent_1">

      <bpmn:outgoing>Flow_0w5epa1</bpmn:outgoing>

      <bpmn:timerEventDefinition id="TimerEventDefinition_14ilbim">

        <bpmn:timeCycle xsi:type="bpmn:tFormalExpression">R2/2022-02-11T09:07/PT1M</bpmn:timeCycle>

      </bpmn:timerEventDefinition>

    </bpmn:startEvent>

    <bpmn:boundaryEvent id="Event_0m9gmvl" name="超時自動流轉" attachedToRef="Activity_1bxm9f3">

      <bpmn:outgoing>Flow_0gb67p8</bpmn:outgoing>

      <bpmn:timerEventDefinition id="TimerEventDefinition_1epfipx">

        <bpmn:timeDuration xsi:type="bpmn:tFormalExpression">PT3M</bpmn:timeDuration>

      </bpmn:timerEventDefinition>

    </bpmn:boundaryEvent>

    <bpmn:sequenceFlow id="Flow_0gb67p8" sourceRef="Event_0m9gmvl" targetRef="Activity_0wkolx8" />

  </bpmn:process>

  <bpmndi:BPMNDiagram id="BPMNDiagram_1">

    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1hroby5">

      <bpmndi:BPMNEdge id="Flow_0a2yjox_di" bpmnElement="Flow_0a2yjox">

        <di:waypoint x="590" y="117" />

        <di:waypoint x="652" y="117" />

      </bpmndi:BPMNEdge>

      <bpmndi:BPMNEdge id="Flow_0rzgepj_di" bpmnElement="Flow_0rzgepj">

        <di:waypoint x="370" y="117" />

        <di:waypoint x="490" y="117" />

      </bpmndi:BPMNEdge>

      <bpmndi:BPMNEdge id="Flow_0w5epa1_di" bpmnElement="Flow_0w5epa1">

        <di:waypoint x="215" y="117" />

        <di:waypoint x="270" y="117" />

      </bpmndi:BPMNEdge>

      <bpmndi:BPMNEdge id="Flow_0gb67p8_di" bpmnElement="Flow_0gb67p8">

        <di:waypoint x="330" y="175" />

        <di:waypoint x="330" y="195" />

        <di:waypoint x="540" y="195" />

        <di:waypoint x="540" y="157" />

      </bpmndi:BPMNEdge>

      <bpmndi:BPMNShape id="Activity_18kpbpa_di" bpmnElement="Activity_1bxm9f3">

        <dc:Bounds x="270" y="77" width="100" height="80" />

      </bpmndi:BPMNShape>

      <bpmndi:BPMNShape id="Event_1162jaf_di" bpmnElement="StartEvent_1">

        <dc:Bounds x="179" y="99" width="36" height="36" />

      </bpmndi:BPMNShape>

      <bpmndi:BPMNShape id="Activity_1gogmit_di" bpmnElement="Activity_0wkolx8">

        <dc:Bounds x="490" y="77" width="100" height="80" />

      </bpmndi:BPMNShape>

      <bpmndi:BPMNShape id="Event_1avte49_di" bpmnElement="Event_1avte49">

        <dc:Bounds x="652" y="99" width="36" height="36" />

      </bpmndi:BPMNShape>

      <bpmndi:BPMNShape id="Event_0lvm3q2_di" bpmnElement="Event_0m9gmvl">

        <dc:Bounds x="312" y="139" width="36" height="36" />

        <bpmndi:BPMNLabel>

          <dc:Bounds x="347" y="163" width="66" height="14" />

        </bpmndi:BPMNLabel>

      </bpmndi:BPMNShape>

    </bpmndi:BPMNPlane>

  </bpmndi:BPMNDiagram>

</bpmn:definitions>
Camunda定時器事件示例Demo(Timer Events)

二、部署流程並測試驗證

 

流程部署後,檢視資料庫定時任務定義表act_ru_jobdef,發現timer-start-event和timer-transition均已持久化到資料庫中。

Camunda定時器事件示例Demo(Timer Events)

 

此時檢視資料庫定時任務執行表act_ru_job,timer-start-event已經就緒。

Camunda定時器事件示例Demo(Timer Events)

 

通過demo使用者登入camunda平臺http://localhost:8080/camunda/app/tasklist/default/#/login,觀察流程執行狀態,發現到達時間後,流程自動啟動了,表明計時器啟動事件Timer Start Event生效了

 

 

此時再檢視資料庫定時任務執行表act_ru_job:

 

 

等待3分鐘後,再檢視流程的執行狀態,發現流轉自動流轉到了任務二節點,說明計時器邊界事件Timer Boundary Event生效了。

 

 

三、如何定義定時器

使用ISO 8601時間格式配置計時器。計時器定義必須恰好具有以下元素之一。

 

1、固定時間

這種格式按照ISO 8601格式指定觸發器被觸發的固定時間和日期。

例子:

<timerEventDefinition>

  <timeDate>2011-03-11T12:13:14Z</timeDate>

</timerEventDefinition>

 

2、時間間隔

要指定計時器在觸發之前應該執行多長時間,可以將timeDuration指定為timerEventDefinition的子元素。可以用兩種不同的ISO 8601持續時間格式定義持續時間:

PnYnMnDTnHnMnS

PnW

例如(間隔為10天):

<timerEventDefinition>

  <timeDuration>P10D</timeDuration>

</timerEventDefinition>

 

3、時間週期

指定重複的間隔,這對於週期性地啟動程式或為過期的使用者任務傳送多個提醒非常有用。一個時間週期元素可以有兩種格式。一個選項是重複出現的時間持續時間的格式,由ISO 8601重複間隔標準指定。

例如(3次重複間隔,每次持續10小時):

<timerEventDefinition>

  <timeCycle>R3/PT10H</timeCycle>

</timerEventDefinition>

此外,你可以使用cron表示式指定一個時間週期,下面的例子顯示了一個觸發器每5分鐘觸發一次,從滿小時開始:

0 0/5 * * * ?

 

參考:

Timer Events | docs.camunda.org

https://docs.camunda.org/manual/7.15/user-guide/process-engine/the-job-executor/

相關文章