Flowable开始事件-定时开始事件

✨✨✨ 最好用的Flowable流程设计器


定时开始事件


一、定义

定时开始事件用于在指定时间启动一个流程,或者在指定周期内循环启动多次流程,如在2023年8月25号10点发起年度目标审核流程,或每月1号启动财务结算处理流程。当满足设定的时间条件时,定时启动时间就会被触发,从而启动流程。

注意:
1、子流程中不能嵌入定时开始事件
2、 定时开始事件会自动触发流程启动,无需调用API启动流程,如果调用会启动两个流程实例
3、 如果定时开始事件的流程重新部署,新的流程定义会冲刷掉老的流程定义,定时作业也会刷新,再起自动启动流程会启动新的流程定义
4、 如果想使用定时启动事件需要开启作业任务 配置如下:configuration.setAsyncExecutorActivate(true);

注意

1. 图形标记

在这里插入图片描述

2. XML标记

定时开始事件的XML内容是普通开始事件的定义中嵌入一个定时事件。定时开始事件的定义格式如下三种形式:

2.1、在指定时间点执行

如:在2023-08-11T12:13:14执行启动该流程

<startEvent id="start">
   <timerEventDefinition>
      <timeDate>2023-08-11T12:13:14</timeDate>
    </timerEventDefinition>
</startEvent>

2.2、指定定时器之前要等待多长时间, timeDuration可以设置为timerEventDefinition的子元素。

示例:等待10天执行

<startEvent id="start">
   <timerEventDefinition>
       <timeDuration>P10D</timeDuration>
    </timerEventDefinition>
</startEvent>

2.3、指定重复执行的间隔, 可以用来定期启动流程实例,或为超时时间发送多个提醒。timeCycle元素可以使用两种格式。

2.3.1、第一种是 ISO 8601 标准的格式

示例:重复3次,从2023年7月7号 8点25分开始执行 每间隔10小时执行一次

<startEvent id="start">
   <timerEventDefinition>
       <timeCycle>R3/2023-07-07T08:25/PT10H</timeCycle>
    </timerEventDefinition>
</startEvent>

2.3.2、cron格式

示例:如每月月初启动一个任务

<startEvent id="start" >
      <timerEventDefinition>
        <timeCycle>0 0 2 1 * ?</timeCycle>
      </timerEventDefinition>
</startEvent>

二、测试用例

2.1 延时定时开始事件xml文件

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/processdef">
  <process id="TimerStartEventProcess" name="定时开始事件示例流程" isExecutable="true">
    <!-- 定义定时开始事件 -->
    <startEvent id="start">
      <timerEventDefinition>
        <timeDuration>PT1M</timeDuration>
      </timerEventDefinition>
    </startEvent>
    <userTask id="task1" name="数据上报"></userTask>
    <endEvent id="end"></endEvent>
    <sequenceFlow id="sequenceFlow1" sourceRef="start" targetRef="task1"></sequenceFlow>
    <sequenceFlow id="sequenceFlow2" sourceRef="task1" targetRef="end"></sequenceFlow>
  </process>

  <bpmndi:BPMNDiagram id="BPMNDiagram_TimerStartEventProcess">
    <bpmndi:BPMNPlane bpmnElement="TimerStartEventProcess" id="BPMNPlane_TimerStartEventProcess">
      <bpmndi:BPMNShape bpmnElement="start" id="BPMNShape_start">
        <omgdc:Bounds height="31.0" width="31.0" x="100.0" y="150.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="task1" id="BPMNShape_task1">
        <omgdc:Bounds height="80.0" width="100.0" x="255.0" y="125.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="end" id="BPMNShape_end">
        <omgdc:Bounds height="28.0" width="28.0" x="480.0" y="151.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="sequenceFlow1" id="BPMNEdge_sequenceFlow1">
        <omgdi:waypoint x="130.99994604632707" y="165.45910304473264"></omgdi:waypoint>
        <omgdi:waypoint x="255.0" y="165.13192612137203"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sequenceFlow2" id="BPMNEdge_sequenceFlow2">
        <omgdi:waypoint x="355.0" y="165.0"></omgdi:waypoint>
        <omgdi:waypoint x="480.0" y="165.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

2.2 基于springboot的测试用例(延时定时开始事件)

@Slf4j
@SpringBootTest(classes = ProdFlowBpmnUiAdminApplication.class, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
public class TimeStartEventTest extends AbstractFlowableEngine {

    @Test
    public void testTimeDuration() throws Exception{
        ProcessDefinition processDefinition = deployByClasspathResource("startEvent/TimerStartEventProcess.bpmn20.xml");

        Thread.sleep(1000*90);

        TaskQuery taskQuery = taskService.createTaskQuery().processDefinitionId(processDefinition.getId());

        List<Task> list = taskQuery.list();
        if (CollectionUtils.isNotEmpty(list)) {
            list.forEach(task -> {
                log.info("任务名称为:{}", task.getName());
            });
        }

    }
}

2.3、循环定时开始事件xml内容

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/processdef">
  <process id="TimeCycleStartEventProcess" name="定时开始事件示例流程" isExecutable="true">
    <!-- 定义定时开始事件 -->
    <startEvent id="start">
      <timerEventDefinition>
        <timeCycle>0 40 10 ? * *</timeCycle>
      </timerEventDefinition>
    </startEvent>
    <userTask id="task1" name="数据上报"></userTask>
    <endEvent id="end"></endEvent>
    <sequenceFlow id="sequenceFlow1" sourceRef="start" targetRef="task1"></sequenceFlow>
    <sequenceFlow id="sequenceFlow2" sourceRef="task1" targetRef="end"></sequenceFlow>
  </process>

  <bpmndi:BPMNDiagram id="BPMNDiagram_TimerStartEventProcess">
    <bpmndi:BPMNPlane bpmnElement="TimerStartEventProcess" id="BPMNPlane_TimerStartEventProcess">
      <bpmndi:BPMNShape bpmnElement="start" id="BPMNShape_start">
        <omgdc:Bounds height="31.0" width="31.0" x="100.0" y="150.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="task1" id="BPMNShape_task1">
        <omgdc:Bounds height="80.0" width="100.0" x="255.0" y="125.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="end" id="BPMNShape_end">
        <omgdc:Bounds height="28.0" width="28.0" x="480.0" y="151.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="sequenceFlow1" id="BPMNEdge_sequenceFlow1">
        <omgdi:waypoint x="130.99994604632707" y="165.45910304473264"></omgdi:waypoint>
        <omgdi:waypoint x="255.0" y="165.13192612137203"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sequenceFlow2" id="BPMNEdge_sequenceFlow2">
        <omgdi:waypoint x="355.0" y="165.0"></omgdi:waypoint>
        <omgdi:waypoint x="480.0" y="165.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

2.4、循环定时开始事件测试用例

  @Test
    public void testTimeCycle() throws Exception {
        ProcessDefinition processDefinition = this.deployByClasspathResource("startEvent/TimeCycleStartEventProcess.bpmn20.xml");

        Thread.sleep(1000 * 70);

        List<Task> list = taskService.createTaskQuery().processDefinitionId(processDefinition.getId()).list();
        if (CollectionUtils.isNotEmpty(list)) {
            list.forEach(task -> log.info("任务名称为:{}", task.getName()));
        }
    }

三、操作界面

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

总结

定时启动事件,对企业规范化操作是非常有帮助的,通过梳理业务流程,我们能清晰的知道哪些审批流程在什么时间点可以自动触发,大大节约了成本,起到降本增效之目的。
注意:
timeDate 和timeDuration 只能执行一次,如果需要定时重复执行的话,需要使用周期定时启动 timeCycle

视频地址:

定时器开始组件讲解1
定时器开始组件讲解2

演示demo

定时器开始事件

本文中内容和案例出自贺波老师的书《深入Activiti流程引擎:核心原理与高阶实战》,书中的介绍更全面、详细,推荐给大家。
深入Activiti流程引擎

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小学生05101

flowable

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值