1.引言

在BPMN中,可以通过改变“Timer Start Event” 启动节点的启动类型来自动启动流程实例。
其提供了下面三种定时自动触发流程实例的模式:

  • 指定固定的时间点启动一个新的流程实例
  • 指定相对延迟时间启动一个新的流程实例
  • 周期性的启动一个新的流程实例

下面分别就上面的三种方式进行设计和实验~
三种使用方式,如下:
(1)Date:特定时间(例:2022-05-25T16:00:00)
其支持的是ISO 8601标准,需要注意是,如果最后带了“Z”,说明用的是带时区的时间。
比如下面的例子,
2019-10-01T12:00:00Z - UTC time
2019-10-02T08:09:40+02:00 - UTC plus two hours zone offset 相对UTC时区加了2个时区
2019-10-02T08:09:40+02:00[Europe/Berlin] - UTC plus two hours zone offset at Berlin

如果不加Z表示就是当地的时间。 比如这个2022-05-25T16:00:00设置,其意思就是流程部署后,会在应用部署的时区内2022-05-25 16:00的时候启动一次而且仅仅一次~

(2)Duration: 延迟时间(例:PT10M)
Duration的格式符合ISO_8601标准,其格式如下:

  • P(n)Y(n)M(n)DT(n)H(n)M(n)S 其中n代表的具体的数值
  • PnW

其具体说明如下:

  • P is the duration designator (for period) placed at the start of the duration representation. 主要指周期
  • Y is the year designator that follows the value for the number of years. 代表年
  • M is the month designator that follows the value for the number of months. 代表月
  • W is the week designator that follows the value for the number of weeks. 代表周的缩写
  • D is the day designator that follows the value for the number of days. 代表天的缩写
  • T is the time designator that precedes the time components of the representation. 代表前置时间
  • H is the hour designator that follows the value for the number of hours. 代表小时
  • M is the minute designator that follows the value for the number of minutes. 代表分钟
  • S is the second designator that follows the value for the number of seconds. 代表秒

其中P, Y, M, W, D, T, H, M, and S 能被忽略但是不能被替换

比如:PT10M标识其在部署后,10分钟后启动流程~

再来看一些例子:
PT15S - 15 seconds 15秒后创建一个流程实例~
PT1H30M - 1 hour and 30 minutes 1个小时30分钟后创建一个流程实例~
P14D - 14 days 14天后创建流程~
P14DT1H30M - 14 days, 1 hour and 30 minutes 14天1小时30分钟后创建一个流程实例~
P3Y6M4DT12H30M5S - 3 years, 6 months, 4 days, 12 hours, 30 minutes and 5 seconds 3年6个月4天12个小时30分5秒后创建一个流程实例~

(3)Cycle:循环时间(例:RS3/2022-05-25T16:00:00/PT30S)
Cycle支持的标准是ISO_8601的重复间隔标准,
下面是具体的例子:
R5/PT10S: Every 10 seconds, up to five times 每10秒触发一次,最多5次
R/P1D: Every day, infinitely ; 每天触发一次,无限循环
当然其也支持Cron的正则表达式,
比如下面就代表其当前的流程实例每隔5分钟就会启动一次:

0 0/5 * * * ?

下面举一个例子,比如下面的2022-05-25T16:00:00,每间隔30s就会触发一次,总共触发3次;

格式解析
RS3/2022-05-25T16:00:00/PT30S
重复次数/开始时间/运行间隔
重复次数:R - 将永远重复;R3- 将重复3次。
开始时间 :2021年11月19日16点00分00秒开始
运行间隔 :30秒

例如: P1Y2M3DT2H10M30S 表示间隔1年2个月3天2小时10分钟30秒
PT2M 表示间隔2分钟(Per Time 2 minutes)
注意:T是时间和日期分的割标记,如果没有年月日"T"也不能省略

  • 计时器启动事件可用特定时间或者循环时间
  • 中间计时器事件可用特定时间或延迟时间。
  • 周期时间用于计时器启动事件或附加的非中断计时器边界事件

2.Camunda的实现原理

通过观察Camunda的数据库的变化,我们可以推测出其实现的原理。下面一个一个的来看:
(1)Date:特定时间(例:2022-05-25T10:40:00)

<?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:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_1mnxduk" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="4.11.1" modeler:executionPlatform="Camunda Platform" modeler:executionPlatformVersion="7.15.0"><bpmn:process id="Process_14pjj1v" name="请假流程" isExecutable="true"><bpmn:startEvent id="StartEvent_1" name="特定时间启动"><bpmn:outgoing>Flow_1ihjej0</bpmn:outgoing><bpmn:timerEventDefinition id="TimerEventDefinition_0bshgz6"><bpmn:timeDate xsi:type="bpmn:tFormalExpression">2022-05-24T10:53:00</bpmn:timeDate></bpmn:timerEventDefinition></bpmn:startEvent><bpmn:sequenceFlow id="Flow_1ihjej0" sourceRef="StartEvent_1" targetRef="Activity_1tiqpqb" /><bpmn:sequenceFlow id="Flow_0748tlu" sourceRef="Activity_1tiqpqb" targetRef="Activity_0jzwi5i" /><bpmn:endEvent id="Event_1yb23ri" name="结束"><bpmn:incoming>Flow_0a6rwts</bpmn:incoming></bpmn:endEvent><bpmn:sequenceFlow id="Flow_0a6rwts" sourceRef="Activity_0jzwi5i" targetRef="Event_1yb23ri" /><bpmn:userTask id="Activity_1tiqpqb" name="请假" camunda:assignee="demo"><bpmn:incoming>Flow_1ihjej0</bpmn:incoming><bpmn:outgoing>Flow_0748tlu</bpmn:outgoing></bpmn:userTask><bpmn:userTask id="Activity_0jzwi5i" name="审批" camunda:assignee="demo"><bpmn:incoming>Flow_0748tlu</bpmn:incoming><bpmn:outgoing>Flow_0a6rwts</bpmn:outgoing></bpmn:userTask></bpmn:process><bpmndi:BPMNDiagram id="BPMNDiagram_1"><bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_14pjj1v"><bpmndi:BPMNEdge id="Flow_1ihjej0_di" bpmnElement="Flow_1ihjej0"><di:waypoint x="215" y="117" /><di:waypoint x="270" y="117" /></bpmndi:BPMNEdge><bpmndi:BPMNEdge id="Flow_0748tlu_di" bpmnElement="Flow_0748tlu"><di:waypoint x="370" y="117" /><di:waypoint x="430" y="117" /></bpmndi:BPMNEdge><bpmndi:BPMNEdge id="Flow_0a6rwts_di" bpmnElement="Flow_0a6rwts"><di:waypoint x="530" y="117" /><di:waypoint x="592" y="117" /></bpmndi:BPMNEdge><bpmndi:BPMNShape id="Event_1xfvi9y_di" bpmnElement="StartEvent_1"><dc:Bounds x="179" y="99" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="165" y="142" width="65" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape><bpmndi:BPMNShape id="Event_1yb23ri_di" bpmnElement="Event_1yb23ri"><dc:Bounds x="592" y="99" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="599" y="142" width="22" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape><bpmndi:BPMNShape id="Activity_0sq8nj2_di" bpmnElement="Activity_1tiqpqb"><dc:Bounds x="270" y="77" width="100" height="80" /></bpmndi:BPMNShape><bpmndi:BPMNShape id="Activity_0pt371x_di" bpmnElement="Activity_0jzwi5i"><dc:Bounds x="430" y="77" width="100" height="80" /></bpmndi:BPMNShape></bpmndi:BPMNPlane></bpmndi:BPMNDiagram>
</bpmn:definitions>

部署之后,查询 select * from ACT_RU_JOB,其里面添加了一条新的数据;

 select * from ACT_RU_JOB
{"select * from ACT_RU_JOB": [{"ID_" : "225e7949-db0c-11ec-8676-005056c00008","REV_" : 1,"TYPE_" : "timer","LOCK_EXP_TIME_" : null,"LOCK_OWNER_" : null,"EXCLUSIVE_" : 1,"EXECUTION_ID_" : null,"PROCESS_INSTANCE_ID_" : null,"PROCESS_DEF_ID_" : "Process_14pjj1v:1:225d19b7-db0c-11ec-8676-005056c00008","PROCESS_DEF_KEY_" : "Process_14pjj1v","RETRIES_" : 3,"EXCEPTION_STACK_ID_" : null,"EXCEPTION_MSG_" : null,"FAILED_ACT_ID_" : null,"DUEDATE_" : "2022-05-24 10:53:00","REPEAT_" : null,"REPEAT_OFFSET_" : 0,"HANDLER_TYPE_" : "timer-start-event","HANDLER_CFG_" : "Process_14pjj1v","DEPLOYMENT_ID_" : "22577465-db0c-11ec-8676-005056c00008","SUSPENSION_STATE_" : 1,"JOB_DEF_ID_" : "225d19b8-db0c-11ec-8676-005056c00008","PRIORITY_" : 0,"SEQUENCE_COUNTER_" : 1,"TENANT_ID_" : null,"CREATE_TIME_" : "2022-05-24 10:49:30"}
]}

Job的定义如下:

{"select * from ACT_RU_JOBDEF": [{"ID_" : "225d19b8-db0c-11ec-8676-005056c00008","REV_" : 1,"PROC_DEF_ID_" : "Process_14pjj1v:1:225d19b7-db0c-11ec-8676-005056c00008","PROC_DEF_KEY_" : "Process_14pjj1v","ACT_ID_" : "StartEvent_1","JOB_TYPE_" : "timer-start-event","JOB_CONFIGURATION_" : "DATE: 2022-05-24T10:53:00","SUSPENSION_STATE_" : 1,"JOB_PRIORITY_" : null,"TENANT_ID_" : null,"DEPLOYMENT_ID_" : null}
]}

同时执行查询 select * from ACT_RU_TASK, 其表是空的

这个时候,我们看到用户任务里面没有待审批的工作流,表ACT_RU_TASK和ACT_RU_EXECUTION
也查询不到数据。

等到2022-05-24T10:53的时候,我们可以看到任务出现在Demo用户下:

同时,表ACT_RU_JOB里面的响应记录被删除;表ACT_RU_TASK和ACT_RU_EXECUTION有执行记录。

{"select * from ACT_RU_TASK": [{"ID_" : "ad612c9e-db0c-11ec-8676-005056c00008","REV_" : 1,"EXECUTION_ID_" : "ad60de7b-db0c-11ec-8676-005056c00008","PROC_INST_ID_" : "ad60de7b-db0c-11ec-8676-005056c00008","PROC_DEF_ID_" : "Process_14pjj1v:1:225d19b7-db0c-11ec-8676-005056c00008","CASE_EXECUTION_ID_" : null,"CASE_INST_ID_" : null,"CASE_DEF_ID_" : null,"NAME_" : "请假","PARENT_TASK_ID_" : null,"DESCRIPTION_" : null,"TASK_DEF_KEY_" : "Activity_1tiqpqb","OWNER_" : null,"ASSIGNEE_" : "demo","DELEGATION_" : null,"PRIORITY_" : 50,"CREATE_TIME_" : "2022-05-24 10:53:24","DUE_DATE_" : null,"FOLLOW_UP_DATE_" : null,"SUSPENSION_STATE_" : 1,"TENANT_ID_" : null}
]}{"select * from ACT_RU_EXECUTION": [{"ID_" : "ad60de7b-db0c-11ec-8676-005056c00008","REV_" : 1,"ROOT_PROC_INST_ID_" : "ad60de7b-db0c-11ec-8676-005056c00008","PROC_INST_ID_" : "ad60de7b-db0c-11ec-8676-005056c00008","BUSINESS_KEY_" : null,"PARENT_ID_" : null,"PROC_DEF_ID_" : "Process_14pjj1v:1:225d19b7-db0c-11ec-8676-005056c00008","SUPER_EXEC_" : null,"SUPER_CASE_EXEC_" : null,"CASE_INST_ID_" : null,"ACT_ID_" : "Activity_1tiqpqb","ACT_INST_ID_" : "Activity_1tiqpqb:ad61058d-db0c-11ec-8676-005056c00008","IS_ACTIVE_" : 1,"IS_CONCURRENT_" : 0,"IS_SCOPE_" : 1,"IS_EVENT_SCOPE_" : 0,"SUSPENSION_STATE_" : 1,"CACHED_ENT_STATE_" : 2,"SEQUENCE_COUNTER_" : 3,"TENANT_ID_" : null}
]}

(2)Duration: 延迟时间(例:PT3M,PT60S)
下面让当前的任务在部署后延迟3分钟后启动,流程如下:

<?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:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_07guhgc" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="4.11.1" modeler:executionPlatform="Camunda Platform" modeler:executionPlatformVersion="7.15.0"><bpmn:process id="Process_1l8shll" name="定时启动流程" isExecutable="true"><bpmn:startEvent id="StartEvent_1" name="定时启动"><bpmn:outgoing>Flow_1vlwakc</bpmn:outgoing><bpmn:timerEventDefinition id="TimerEventDefinition_0qlgfxu"><bpmn:timeDuration xsi:type="bpmn:tFormalExpression">PT3M</bpmn:timeDuration></bpmn:timerEventDefinition></bpmn:startEvent><bpmn:sequenceFlow id="Flow_1vlwakc" sourceRef="StartEvent_1" targetRef="Activity_1v7sbrd" /><bpmn:endEvent id="Event_0pi412e" name="结束"><bpmn:incoming>Flow_07cx1sg</bpmn:incoming></bpmn:endEvent><bpmn:sequenceFlow id="Flow_07cx1sg" sourceRef="Activity_1v7sbrd" targetRef="Event_0pi412e" /><bpmn:userTask id="Activity_1v7sbrd" name="定时启动触发的任务" camunda:assignee="demo"><bpmn:incoming>Flow_1vlwakc</bpmn:incoming><bpmn:outgoing>Flow_07cx1sg</bpmn:outgoing></bpmn:userTask></bpmn:process><bpmndi:BPMNDiagram id="BPMNDiagram_1"><bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1l8shll"><bpmndi:BPMNEdge id="Flow_1vlwakc_di" bpmnElement="Flow_1vlwakc"><di:waypoint x="215" y="117" /><di:waypoint x="270" y="117" /></bpmndi:BPMNEdge><bpmndi:BPMNEdge id="Flow_07cx1sg_di" bpmnElement="Flow_07cx1sg"><di:waypoint x="370" y="117" /><di:waypoint x="432" y="117" /></bpmndi:BPMNEdge><bpmndi:BPMNShape id="Event_0iv489d_di" bpmnElement="StartEvent_1"><dc:Bounds x="179" y="99" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="176" y="142" width="43" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape><bpmndi:BPMNShape id="Event_0pi412e_di" bpmnElement="Event_0pi412e"><dc:Bounds x="432" y="99" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="439" y="142" width="22" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape><bpmndi:BPMNShape id="Activity_1gvk3cr_di" bpmnElement="Activity_1v7sbrd"><dc:Bounds x="270" y="77" width="100" height="80" /></bpmndi:BPMNShape></bpmndi:BPMNPlane></bpmndi:BPMNDiagram>
</bpmn:definitions>

部署之后,咱们查看数据库:表ACT_RU_JOB和ACT_RU_JOBDEF有数据;
ACT_RU_TASK和ACT_RU_EXECUTION没有数据。
当前用户[demo]的用户任务里面没有任务

{"select * from ACT_RU_JOB": [{"ID_" : "5da0d864-db0e-11ec-8676-005056c00008","REV_" : 1,"TYPE_" : "timer","LOCK_EXP_TIME_" : null,"LOCK_OWNER_" : null,"EXCLUSIVE_" : 1,"EXECUTION_ID_" : null,"PROCESS_INSTANCE_ID_" : null,"PROCESS_DEF_ID_" : "Process_1l8shll:1:5d9fc6f2-db0e-11ec-8676-005056c00008","PROCESS_DEF_KEY_" : "Process_1l8shll","RETRIES_" : 3,"EXCEPTION_STACK_ID_" : null,"EXCEPTION_MSG_" : null,"FAILED_ACT_ID_" : null,"DUEDATE_" : "2022-05-24 11:08:29","REPEAT_" : null,"REPEAT_OFFSET_" : 0,"HANDLER_TYPE_" : "timer-start-event","HANDLER_CFG_" : "Process_1l8shll","DEPLOYMENT_ID_" : "5d984ce0-db0e-11ec-8676-005056c00008","SUSPENSION_STATE_" : 1,"JOB_DEF_ID_" : "5d9fc6f3-db0e-11ec-8676-005056c00008","PRIORITY_" : 0,"SEQUENCE_COUNTER_" : 1,"TENANT_ID_" : null,"CREATE_TIME_" : "2022-05-24 11:05:29"}
]}
{"select * from ACT_RU_JOBDEF": [{"ID_" : "5d9fc6f3-db0e-11ec-8676-005056c00008","REV_" : 1,"PROC_DEF_ID_" : "Process_1l8shll:1:5d9fc6f2-db0e-11ec-8676-005056c00008","PROC_DEF_KEY_" : "Process_1l8shll","ACT_ID_" : "StartEvent_1","JOB_TYPE_" : "timer-start-event","JOB_CONFIGURATION_" : "DURATION: PT3M","SUSPENSION_STATE_" : 1,"JOB_PRIORITY_" : null,"TENANT_ID_" : null,"DEPLOYMENT_ID_" : null}
]}

从上面的ACT_RU_JOB表里面,我们可以看到有一个DUEDATE_的字段,其估计在2022-05-24 11:08:29的时候启动流程;但是我们发现流程的启动不是那么精确,下面将会具体确认。

  • 经过3分钟后,我们查询数据库。
  • 表ACT_RU_JOB已经没有数据
  • 表ACT_RU_JOB和ACT_RU_EXECUTION里面的数据如下:
{"select * from ACT_RU_TASK": [{"ID_" : "e1835b89-db0e-11ec-8676-005056c00008","REV_" : 1,"EXECUTION_ID_" : "e182e656-db0e-11ec-8676-005056c00008","PROC_INST_ID_" : "e182e656-db0e-11ec-8676-005056c00008","PROC_DEF_ID_" : "Process_1l8shll:1:5d9fc6f2-db0e-11ec-8676-005056c00008","CASE_EXECUTION_ID_" : null,"CASE_INST_ID_" : null,"CASE_DEF_ID_" : null,"NAME_" : "定时启动触发的任务","PARENT_TASK_ID_" : null,"DESCRIPTION_" : null,"TASK_DEF_KEY_" : "Activity_1v7sbrd","OWNER_" : null,"ASSIGNEE_" : "demo","DELEGATION_" : null,"PRIORITY_" : 50,"CREATE_TIME_" : "2022-05-24 11:09:10","DUE_DATE_" : null,"FOLLOW_UP_DATE_" : null,"SUSPENSION_STATE_" : 1,"TENANT_ID_" : null}
]}
{"select * from ACT_RU_EXECUTION": [{"ID_" : "e182e656-db0e-11ec-8676-005056c00008","REV_" : 1,"ROOT_PROC_INST_ID_" : "e182e656-db0e-11ec-8676-005056c00008","PROC_INST_ID_" : "e182e656-db0e-11ec-8676-005056c00008","BUSINESS_KEY_" : null,"PARENT_ID_" : null,"PROC_DEF_ID_" : "Process_1l8shll:1:5d9fc6f2-db0e-11ec-8676-005056c00008","SUPER_EXEC_" : null,"SUPER_CASE_EXEC_" : null,"CASE_INST_ID_" : null,"ACT_ID_" : "Activity_1v7sbrd","ACT_INST_ID_" : "Activity_1v7sbrd:e1833478-db0e-11ec-8676-005056c00008","IS_ACTIVE_" : 1,"IS_CONCURRENT_" : 0,"IS_SCOPE_" : 1,"IS_EVENT_SCOPE_" : 0,"SUSPENSION_STATE_" : 1,"CACHED_ENT_STATE_" : 2,"SEQUENCE_COUNTER_" : 3,"TENANT_ID_" : null}
]}

从上面的表ACT_RU_TASK,里面的用户任务创建的时间来看,其是在2022-05-24 11:09:10 被创建的;说明和预估的时间有几十秒的差异;大家在使用定时任务的时候可能要特别注意。

(3)Cycle:循环时间(例:R3/2022-05-24T11:40:00/PT30S)
当前例子触发的条件,R3/2022-05-24T13:45:00/PT30S

其流程的文件如下:

<?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:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_0q7aoqg" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="4.11.1" modeler:executionPlatform="Camunda Platform" modeler:executionPlatformVersion="7.15.0"><bpmn:process id="Process_1xbub4w" name="循环执行流程" isExecutable="true"><bpmn:startEvent id="StartEvent_1" name="启动循环执行"><bpmn:outgoing>Flow_0iu9vjx</bpmn:outgoing><bpmn:timerEventDefinition id="TimerEventDefinition_0twu21y"><bpmn:timeCycle xsi:type="bpmn:tFormalExpression">R3/2022-05-24T13:45:00/PT30S</bpmn:timeCycle></bpmn:timerEventDefinition></bpmn:startEvent><bpmn:sequenceFlow id="Flow_0iu9vjx" sourceRef="StartEvent_1" targetRef="Activity_1cozyk4" /><bpmn:userTask id="Activity_1cozyk4" name="循环执行用户任务" camunda:assignee="demo"><bpmn:incoming>Flow_0iu9vjx</bpmn:incoming><bpmn:outgoing>Flow_0e5x62x</bpmn:outgoing></bpmn:userTask><bpmn:endEvent id="Event_1yjhcvb" name="结束"><bpmn:incoming>Flow_0e5x62x</bpmn:incoming></bpmn:endEvent><bpmn:sequenceFlow id="Flow_0e5x62x" sourceRef="Activity_1cozyk4" targetRef="Event_1yjhcvb" /></bpmn:process><bpmndi:BPMNDiagram id="BPMNDiagram_1"><bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1xbub4w"><bpmndi:BPMNEdge id="Flow_0iu9vjx_di" bpmnElement="Flow_0iu9vjx"><di:waypoint x="215" y="117" /><di:waypoint x="310" y="117" /></bpmndi:BPMNEdge><bpmndi:BPMNEdge id="Flow_0e5x62x_di" bpmnElement="Flow_0e5x62x"><di:waypoint x="410" y="117" /><di:waypoint x="502" y="117" /></bpmndi:BPMNEdge><bpmndi:BPMNShape id="Event_1w01fbs_di" bpmnElement="StartEvent_1"><dc:Bounds x="179" y="99" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="165" y="142" width="66" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape><bpmndi:BPMNShape id="Event_1yjhcvb_di" bpmnElement="Event_1yjhcvb"><dc:Bounds x="502" y="99" width="36" height="36" /><bpmndi:BPMNLabel><dc:Bounds x="509" y="142" width="22" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape><bpmndi:BPMNShape id="Activity_1kfy0rr_di" bpmnElement="Activity_1cozyk4"><dc:Bounds x="310" y="77" width="100" height="80" /></bpmndi:BPMNShape></bpmndi:BPMNPlane></bpmndi:BPMNDiagram>
</bpmn:definitions>

部署之后,其将会自动触发~
查询ACT_RU_JOB和ACT_RU_JOBDEF,其结果如下:

{"select * from ACT_RU_JOB": [{"ID_" : "46f5ebf6-db24-11ec-8676-005056c00008","REV_" : 1,"TYPE_" : "timer","LOCK_EXP_TIME_" : null,"LOCK_OWNER_" : null,"EXCLUSIVE_" : 1,"EXECUTION_ID_" : null,"PROCESS_INSTANCE_ID_" : null,"PROCESS_DEF_ID_" : "Process_1xbub4w:1:46f4da84-db24-11ec-8676-005056c00008","PROCESS_DEF_KEY_" : "Process_1xbub4w","RETRIES_" : 3,"EXCEPTION_STACK_ID_" : null,"EXCEPTION_MSG_" : null,"FAILED_ACT_ID_" : null,"DUEDATE_" : "2022-05-24 13:45:00","REPEAT_" : "R3\/2022-05-24T13:45:00\/PT30S","REPEAT_OFFSET_" : 0,"HANDLER_TYPE_" : "timer-start-event","HANDLER_CFG_" : "Process_1xbub4w","DEPLOYMENT_ID_" : "46ef3532-db24-11ec-8676-005056c00008","SUSPENSION_STATE_" : 1,"JOB_DEF_ID_" : "46f4da85-db24-11ec-8676-005056c00008","PRIORITY_" : 0,"SEQUENCE_COUNTER_" : 1,"TENANT_ID_" : null,"CREATE_TIME_" : "2022-05-24 13:42:20"}
]}
{"select * from ACT_RU_JOBDEF": [{"ID_" : "46f4da85-db24-11ec-8676-005056c00008","REV_" : 1,"PROC_DEF_ID_" : "Process_1xbub4w:1:46f4da84-db24-11ec-8676-005056c00008","PROC_DEF_KEY_" : "Process_1xbub4w","ACT_ID_" : "StartEvent_1","JOB_TYPE_" : "timer-start-event","JOB_CONFIGURATION_" : "CYCLE: R3\/2022-05-24T13:45:00\/PT30S","SUSPENSION_STATE_" : 1,"JOB_PRIORITY_" : null,"TENANT_ID_" : null,"DEPLOYMENT_ID_" : null}
]}

表ACT_RU_TASK和ACT_RU_EXECUTION还是空的。用户Demo里面的任务也是空的。

等时间流转到2022-05-24T13:45:00。我们再来看表里面的数据。

表ACT_RU_JOB和ACT_RU_JOBDEF定义的数据如下:

{"select * from ACT_RU_JOB": [{"ID_" : "d5d3ddc6-db24-11ec-8676-005056c00008","REV_" : 1,"TYPE_" : "timer","LOCK_EXP_TIME_" : null,"LOCK_OWNER_" : null,"EXCLUSIVE_" : 1,"EXECUTION_ID_" : null,"PROCESS_INSTANCE_ID_" : null,"PROCESS_DEF_ID_" : "Process_1xbub4w:1:46f4da84-db24-11ec-8676-005056c00008","PROCESS_DEF_KEY_" : "Process_1xbub4w","RETRIES_" : 3,"EXCEPTION_STACK_ID_" : null,"EXCEPTION_MSG_" : null,"FAILED_ACT_ID_" : null,"DUEDATE_" : "2022-05-24 13:46:30","REPEAT_" : "R3\/2022-05-24T13:45:00\/PT30S","REPEAT_OFFSET_" : 0,"HANDLER_TYPE_" : "timer-start-event","HANDLER_CFG_" : "Process_1xbub4w","DEPLOYMENT_ID_" : "46ef3532-db24-11ec-8676-005056c00008","SUSPENSION_STATE_" : 1,"JOB_DEF_ID_" : "46f4da85-db24-11ec-8676-005056c00008","PRIORITY_" : 0,"SEQUENCE_COUNTER_" : 1,"TENANT_ID_" : null,"CREATE_TIME_" : "2022-05-24 13:46:19"}
]}
{"select * from ACT_RU_JOBDEF": [{"ID_" : "46f4da85-db24-11ec-8676-005056c00008","REV_" : 1,"PROC_DEF_ID_" : "Process_1xbub4w:1:46f4da84-db24-11ec-8676-005056c00008","PROC_DEF_KEY_" : "Process_1xbub4w","ACT_ID_" : "StartEvent_1","JOB_TYPE_" : "timer-start-event","JOB_CONFIGURATION_" : "CYCLE: R3\/2022-05-24T13:45:00\/PT30S","SUSPENSION_STATE_" : 1,"JOB_PRIORITY_" : null,"TENANT_ID_" : null,"DEPLOYMENT_ID_" : null}
]}

任务栏中出现4次任务

查看表ACT_RU_TASK和表ACT_RU_EXECUTION

{"select * from ACT_RU_TASK": [{"ID_" : "abb0d14d-db24-11ec-8676-005056c00008","REV_" : 1,"EXECUTION_ID_" : "abb0aa3a-db24-11ec-8676-005056c00008","PROC_INST_ID_" : "abb0aa3a-db24-11ec-8676-005056c00008","PROC_DEF_ID_" : "Process_1xbub4w:1:46f4da84-db24-11ec-8676-005056c00008","CASE_EXECUTION_ID_" : null,"CASE_INST_ID_" : null,"CASE_DEF_ID_" : null,"NAME_" : "循环执行用户任务","PARENT_TASK_ID_" : null,"DESCRIPTION_" : null,"TASK_DEF_KEY_" : "Activity_1cozyk4","OWNER_" : null,"ASSIGNEE_" : "demo","DELEGATION_" : null,"PRIORITY_" : 50,"CREATE_TIME_" : "2022-05-24 13:45:09","DUE_DATE_" : null,"FOLLOW_UP_DATE_" : null,"SUSPENSION_STATE_" : 1,"TENANT_ID_" : null},{"ID_" : "c0b33c56-db24-11ec-8676-005056c00008","REV_" : 1,"EXECUTION_ID_" : "c0b2ee33-db24-11ec-8676-005056c00008","PROC_INST_ID_" : "c0b2ee33-db24-11ec-8676-005056c00008","PROC_DEF_ID_" : "Process_1xbub4w:1:46f4da84-db24-11ec-8676-005056c00008","CASE_EXECUTION_ID_" : null,"CASE_INST_ID_" : null,"CASE_DEF_ID_" : null,"NAME_" : "循环执行用户任务","PARENT_TASK_ID_" : null,"DESCRIPTION_" : null,"TASK_DEF_KEY_" : "Activity_1cozyk4","OWNER_" : null,"ASSIGNEE_" : "demo","DELEGATION_" : null,"PRIORITY_" : 50,"CREATE_TIME_" : "2022-05-24 13:45:44","DUE_DATE_" : null,"FOLLOW_UP_DATE_" : null,"SUSPENSION_STATE_" : 1,"TENANT_ID_" : null},{"ID_" : "d5d53d5b-db24-11ec-8676-005056c00008","REV_" : 1,"EXECUTION_ID_" : "d5d4ef38-db24-11ec-8676-005056c00008","PROC_INST_ID_" : "d5d4ef38-db24-11ec-8676-005056c00008","PROC_DEF_ID_" : "Process_1xbub4w:1:46f4da84-db24-11ec-8676-005056c00008","CASE_EXECUTION_ID_" : null,"CASE_INST_ID_" : null,"CASE_DEF_ID_" : null,"NAME_" : "循环执行用户任务","PARENT_TASK_ID_" : null,"DESCRIPTION_" : null,"TASK_DEF_KEY_" : "Activity_1cozyk4","OWNER_" : null,"ASSIGNEE_" : "demo","DELEGATION_" : null,"PRIORITY_" : 50,"CREATE_TIME_" : "2022-05-24 13:46:19","DUE_DATE_" : null,"FOLLOW_UP_DATE_" : null,"SUSPENSION_STATE_" : 1,"TENANT_ID_" : null},{"ID_" : "def5aa62-db24-11ec-8676-005056c00008","REV_" : 1,"EXECUTION_ID_" : "def5834f-db24-11ec-8676-005056c00008","PROC_INST_ID_" : "def5834f-db24-11ec-8676-005056c00008","PROC_DEF_ID_" : "Process_1xbub4w:1:46f4da84-db24-11ec-8676-005056c00008","CASE_EXECUTION_ID_" : null,"CASE_INST_ID_" : null,"CASE_DEF_ID_" : null,"NAME_" : "循环执行用户任务","PARENT_TASK_ID_" : null,"DESCRIPTION_" : null,"TASK_DEF_KEY_" : "Activity_1cozyk4","OWNER_" : null,"ASSIGNEE_" : "demo","DELEGATION_" : null,"PRIORITY_" : 50,"CREATE_TIME_" : "2022-05-24 13:46:35","DUE_DATE_" : null,"FOLLOW_UP_DATE_" : null,"SUSPENSION_STATE_" : 1,"TENANT_ID_" : null}
]}{"select * from ACT_RU_EXECUTION": [{"ID_" : "abb0aa3a-db24-11ec-8676-005056c00008","REV_" : 1,"ROOT_PROC_INST_ID_" : "abb0aa3a-db24-11ec-8676-005056c00008","PROC_INST_ID_" : "abb0aa3a-db24-11ec-8676-005056c00008","BUSINESS_KEY_" : null,"PARENT_ID_" : null,"PROC_DEF_ID_" : "Process_1xbub4w:1:46f4da84-db24-11ec-8676-005056c00008","SUPER_EXEC_" : null,"SUPER_CASE_EXEC_" : null,"CASE_INST_ID_" : null,"ACT_ID_" : "Activity_1cozyk4","ACT_INST_ID_" : "Activity_1cozyk4:abb0d14c-db24-11ec-8676-005056c00008","IS_ACTIVE_" : 1,"IS_CONCURRENT_" : 0,"IS_SCOPE_" : 1,"IS_EVENT_SCOPE_" : 0,"SUSPENSION_STATE_" : 1,"CACHED_ENT_STATE_" : 2,"SEQUENCE_COUNTER_" : 3,"TENANT_ID_" : null},{"ID_" : "c0b2ee33-db24-11ec-8676-005056c00008","REV_" : 1,"ROOT_PROC_INST_ID_" : "c0b2ee33-db24-11ec-8676-005056c00008","PROC_INST_ID_" : "c0b2ee33-db24-11ec-8676-005056c00008","BUSINESS_KEY_" : null,"PARENT_ID_" : null,"PROC_DEF_ID_" : "Process_1xbub4w:1:46f4da84-db24-11ec-8676-005056c00008","SUPER_EXEC_" : null,"SUPER_CASE_EXEC_" : null,"CASE_INST_ID_" : null,"ACT_ID_" : "Activity_1cozyk4","ACT_INST_ID_" : "Activity_1cozyk4:c0b31545-db24-11ec-8676-005056c00008","IS_ACTIVE_" : 1,"IS_CONCURRENT_" : 0,"IS_SCOPE_" : 1,"IS_EVENT_SCOPE_" : 0,"SUSPENSION_STATE_" : 1,"CACHED_ENT_STATE_" : 2,"SEQUENCE_COUNTER_" : 3,"TENANT_ID_" : null},{"ID_" : "d5d4ef38-db24-11ec-8676-005056c00008","REV_" : 1,"ROOT_PROC_INST_ID_" : "d5d4ef38-db24-11ec-8676-005056c00008","PROC_INST_ID_" : "d5d4ef38-db24-11ec-8676-005056c00008","BUSINESS_KEY_" : null,"PARENT_ID_" : null,"PROC_DEF_ID_" : "Process_1xbub4w:1:46f4da84-db24-11ec-8676-005056c00008","SUPER_EXEC_" : null,"SUPER_CASE_EXEC_" : null,"CASE_INST_ID_" : null,"ACT_ID_" : "Activity_1cozyk4","ACT_INST_ID_" : "Activity_1cozyk4:d5d53d5a-db24-11ec-8676-005056c00008","IS_ACTIVE_" : 1,"IS_CONCURRENT_" : 0,"IS_SCOPE_" : 1,"IS_EVENT_SCOPE_" : 0,"SUSPENSION_STATE_" : 1,"CACHED_ENT_STATE_" : 2,"SEQUENCE_COUNTER_" : 3,"TENANT_ID_" : null},{"ID_" : "def5834f-db24-11ec-8676-005056c00008","REV_" : 1,"ROOT_PROC_INST_ID_" : "def5834f-db24-11ec-8676-005056c00008","PROC_INST_ID_" : "def5834f-db24-11ec-8676-005056c00008","BUSINESS_KEY_" : null,"PARENT_ID_" : null,"PROC_DEF_ID_" : "Process_1xbub4w:1:46f4da84-db24-11ec-8676-005056c00008","SUPER_EXEC_" : null,"SUPER_CASE_EXEC_" : null,"CASE_INST_ID_" : null,"ACT_ID_" : "Activity_1cozyk4","ACT_INST_ID_" : "Activity_1cozyk4:def5aa61-db24-11ec-8676-005056c00008","IS_ACTIVE_" : 1,"IS_CONCURRENT_" : 0,"IS_SCOPE_" : 1,"IS_EVENT_SCOPE_" : 0,"SUSPENSION_STATE_" : 1,"CACHED_ENT_STATE_" : 2,"SEQUENCE_COUNTER_" : 3,"TENANT_ID_" : null}
]}

很奇怪,明明我设置了3次循环,为什么会出现四次任务。我估计可能是Camunda的Bug。
而且我加了下面查询条件的SQL之后,还是查出4条数据。

select * from ACT_RU_TASK where PROC_DEF_ID_='Process_1xbub4w:1:46f4da84-db24-11ec-8676-005056c00008';
select * from ACT_RU_EXECUTION where PROC_DEF_ID_='Process_1xbub4w:1:46f4da84-db24-11ec-8676-005056c00008';


难道是偶然发生的? 笔者于是删除了当前的部署,再重新部署, 结果有的时候触发了3次,有的时候触发了4次,不是很准确~

另外需要注意的是,R3/2022-05-24T13:45:00/PT30S 里面的时间不能早于当时部署的时间,否则,用Camunda Modeler部署的时候,其会报出下面的错误。
duedate is null [ deploy-error ]

3.总结

经过上面的实验和研究后,我们发现了Camnda定时启动的3种方式以及触发后数据库里面表的数据的变化。

参考文献

https://docs.camunda.org/manual/7.16/reference/bpmn20/events/timer-events/
https://en.wikipedia.org/wiki/ISO_8601#Durations
https://docs.camunda.io/docs/components/modeler/bpmn/timer-events/

[15]深入浅出工作开源框架Camunda:定时任务相关推荐

  1. [7]深入浅出工作开源框架Camunda: camunda-webapp 用户登录功能代码分析

    在上个章节<[6]深入浅出工作开源框架Camunda: 如何远程Debug camunda-webapp的源代码>笔者解释了如何进行Camunda的远程Debug,这个章节笔者给大家分享如 ...

  2. [1]深入浅出工作开源框架Camunda: 安装和使用

    目前比较出名的开源工作流框架大概有4个,分别是Activiti/Camunda/Flowable/Jbpm.下面我们先抛开Jbpm框架,因为JBPM的二次开发难度比较大:笔者窃以为Camunda是一个 ...

  3. [13]深入浅出工作开源框架Camunda:多实例并行用户任务

    Camunda提供了多实例并行用户任务,比如下面的并行多任务流程! 必须选择三条竖杠. 选择之后,就可以让"并行会签预审批"任务同时由多个人处理~ 参考<基于camunda如 ...

  4. Spring的15款优质开源框架,你用过几个呀?

    来源:https://juejin.im/post/5ef2e2dd6fb9a058727f3bac ❝ 不管是工作还是学习,很多时候我们都不需要自己再造轮子,并且如果有一个足够可用的轮子,在工作或者 ...

  5. 从GitHub中整理出来的15个最受欢迎的Python开源框架,你喜欢哪个

    从GitHub中整理出的15个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python Web应用开发框架 Djang ...

  6. 15 个常用的python 开源框架

    注册登录 shaomine 博客园   首页   新随笔   联系   订阅 正在上传-重新上传取消​  管理 随笔 - 579  文章 - 1  评论 - 69  阅读 - 253万 15个最受欢迎 ...

  7. 贼好用,冰河再次升级了这款开源的精准定时任务和延时队列框架!!

    写在前面 在实际工作中,很多小伙伴在开发定时任务时,会采取定时扫描数据表的方式实现.然而,这种方式存在着重大的缺陷:如果数据量大的话,频繁的扫描数据表会对数据库造成巨大的压力:难以支撑大规模的分布式定 ...

  8. 15个最受欢迎的Python开源框架(转载)

    一.Django: Python Web应用开发框架 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的软件设计模式,即模型M,视图V和控制器C.它最初是被开发来用于管理 ...

  9. 【转】15个最受欢迎的Python开源框架

    以下是伯乐在线从GitHub中整理出的15个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python Web应用开发框 ...

最新文章

  1. Python内置函数filter()和匿名函数lambda解析
  2. 自己在windows下第一次安装pygame成功的经历
  3. .Net 4.X 提前用上 .Net Core 的配置模式以及热重载配置
  4. python元类的使用_python中元类用法实例
  5. 【机器学习】K-Means(非监督学习)学习及实例使用其将图片压缩
  6. Python:我可以使用类变量作为线程锁吗?
  7. 小米10发布会官宣!首次采用纯直播发布,老大哥三星的评论亮了
  8. SourceTree 免注册
  9. Vue的生命周期以及钩子函数
  10. delphi启动ie调用本地html传参数_年轻人不讲武德啊!了解下浏览器如何解析html、css,js
  11. STM32_WS2811驱动
  12. pandas.series.tolist()函数结构及用法
  13. ubuntu桌面美化
  14. Excel引用外部表格,通过Key得到想要的数据
  15. 100个英语超精简口语短句
  16. 百度网盘助手-获取网盘文件的下载地址,破解限速
  17. 大学生计算机PHP实训报告,大学生计算机实训心得体会
  18. 三星80亿美元收购Harmon真正意图是它?
  19. 如何把docx转成doc
  20. coreseek/sphinx中的匹配模式

热门文章

  1. IntelliJ IDEA使用Project Structure
  2. 新版iTunes Connect发布App时,遇到的问题
  3. 使用Arduino的智能盲棒
  4. recreate()、finish()与onBackPressed()
  5. zabbix启动 cannot recreate Zabbix semaphores for IPC 问题
  6. Pycharm安装第三方库以及出错原因(Mac版)
  7. 电影院订票选座网站系统 毕业设计毕设源码毕业论文参考(1)功能概要
  8. Android手机通过USB网络共享限速
  9. 1920像素的屏幕在部分浏览器(chrome,IE等)中只有1536px解决办法
  10. Java编程案例:买飞机票