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/
Camunda定时器事件示例Demo(Timer Events)的更多相关文章
- Nginx事件管理之定时器事件
1. 缓存时间 1.1 管理 Nginx 中的每个进程都会单独地管理当前时间.ngx_time_t 结构体是缓存时间变量的类型: typedef struct { /* 格林威治时间1970年1月1日 ...
- 【Nginx】定时器事件
转自:烟雨江南 Nginx事件管理主要是网络事件和定时器事件.下面介绍定时器事件管理,即超时管理. 为什么进行超时管理? Nginx有必要对可能发生超时的事件 进行统一管理,并在事件超时时作出相应的处 ...
- C# 定时器事件(设置时间间隔,间歇性执行某一函数,控制台程序)
定时器事件代码 static void Main(string[] args) { Method(); #region 定时器事件 Timer aTimer = new Timer(); aTimer ...
- 【转】C# 定时器事件(设置时间间隔,间歇性执行某一函数,控制台程序)
using System.Timers;定时器事件代码 static void Main(string[] args) { Method(); #region 定时器事件 Timer aTimer = ...
- 定时器事件QtimerEvent 随机数 qrand Qtimer定时器
QTimerEvent类:定时器事件.QObject的子类都可使用 int QObject::startTimer(int interval)[参数:毫秒][返回值:定时器整型编号]来开启一个定时器 ...
- QT_8_Qt中的事件处理_定时器事件_定时器类_事件分发器_事件过滤器_绘图事件_高级绘图事件_绘图设备_QFile 文件读写_QFileInfo文件信息
Qt中的事件处理 1.1. 捕获QLabel中是鼠标事件 1.2. enterevent 鼠标进入 1.3. leaveevent 鼠标离开 1.4. 鼠标按下MyLabel::mousePressE ...
- Qt事件系统之四:定时器事件与随机数
一.定时器事件和随机数 QTimerEvent类用来描述一个定时器事件.对于一个QObject的子类,只需要使用int QObject::startTimer ( int interval)函数来开启 ...
- iOS之ProtocolBuffer搭建和示例demo
这次搭建iOS的ProtocolBuffer编译器和把*.proto源文件编译成*.pbobjc.h 和 *.pbobjc.m文件时,碰到不少问题! 搭建pb编译器到时没有什么问题,只是在把*.pro ...
- c#实例化继承类,必须对被继承类的程序集做引用 .net core Redis分布式缓存客户端实现逻辑分析及示例demo 数据库笔记之索引和事务 centos 7下安装python 3.6笔记 你大波哥~ C#开源框架(转载) JSON C# Class Generator ---由json字符串生成C#实体类的工具
c#实例化继承类,必须对被继承类的程序集做引用 0x00 问题 类型“Model.NewModel”在未被引用的程序集中定义.必须添加对程序集“Model, Version=1.0.0.0, Cu ...
随机推荐
- c++对c的拓展_函数的引用
注意:1.引用可作为形参较指针更为直观 2可作为返回值 (判断标准:空间是否释放) #include <iostream> #include <stdlib.h> using ...
- numpy教程01---ndarray的创建
欢迎关注公众号[Python开发实战], 获取更多内容! 工具-numpy numpy是使用Python进行数据科学的基础库.numpy以一个强大的N维数组对象为中心,它还包含有用的线性代数,傅里叶变 ...
- 第一阶段:Java基础之变量
1.实例变量 #实例变量只能在类种声明,必须在构造函数.方法.任何块之外 #实例变量只能通过创建对象使用,当使用new创建对象,实例变量也同时被创建,当垃圾回收器回收对象时,实例变量也被销毁 #当在堆 ...
- 企业需要使用网络损伤仪 WANsim 的帮助,以便更高效地迁移到云端
正确解决与云环境中的应用程序部署有关的问题需要针对每个系统的独特需求以寻找特定的网络工具.网络损伤仪 WANsim 助力企业更高效地迁移到云端! 起初,云厂商以在云端办公相对于传统方式拥有更高的可靠性 ...
- Lumia1520 手机刷 Windows10 arm双系统
注意问题 升级到Windows 10 Mobile 的需重新刷回WP8.1,否则解锁会失败 部分手机刷机win10arm后出现屏幕卡死现象,目前除了换屏或重新焊接暂无其他解决方案,请谨慎刷机(当然如果 ...
- 图数据库|正反向边的最终一致性——TOSS 介绍
本文首发于 Nebula Graph Community 公众号 Nebula Graph v2.6 当中比较重要的特性之一便是 TOSS.通过本文,我将带你全方位了解 TOSS 为何物. 从一条 G ...
- SMTP协议解读以及如何使用SMTP协议发送电子邮件
电子邮件协议中POP3协议用于接收邮件,SMTP协议用于发送邮件.SMTP的全称为Simple Mail Transfer Protocol,也就是简单邮件传输协议,字如其名. 相较于POP3而言 ...
- Unity实现A*寻路算法学习2.0
二叉树存储路径节点 1.0中虽然实现了寻路的算法,但是使用List<>来保存节点性能并不够强 寻路算法学习1.0在这里:https://www.cnblogs.com/AlphaIcaru ...
- Mysql 连续时间分组
该方案:不限于本例的时间连续,也可适用于其他按连续分组. 连续条件 分组这问题困扰了很久,之前觉得在SQL上很难处理,都是在程序上做处理.后面实在有太多这需求了,所以只能想办法在SQL上处理了. 如下 ...
- [RPC学习]Dubbo+nacos实现动态更新内存RTree
1.背景 服务架构一般都是从 单体架构 -> 微服务架构 -> 分布式架构 的迭代,我上一家公司就是在业务发展到一定规模时,开始拆老的单体服务,按业务维度拆成多个微服务,服务之间用的是HT ...