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

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>

表示流程将于2022年2月11日09:07(24小时制)开始,以1分钟为间隔,共启动2次。

 

计时器边界事件Timer Boundary Event节点配置


 

      <bpmn:timerEventDefinition id="TimerEventDefinition_1epfipx">

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

      </bpmn:timerEventDefinition>

表示流程在任务一节点超时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>

二、部署流程并测试验证

 

流程部署后,查看数据库定时任务定义表act_ru_jobdef,发现timer-start-event和timer-transition均已持久化到数据库中。


 

此时查看数据库定时任务执行表act_ru_job,timer-start-event已经就绪。


 

通过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/

posted @ 2022-06-13 11:18  大龄码农有梦想  阅读(1199)  评论(0编辑  收藏  举报