文章目录
- 简介
- Camunda服务
- 根据流程说明Camunda最基本常用表
- 如何通过服务定位相关表
- 常用网关
- 表简介
- 具体表说明
- act_ge_bytearray(二进制数据表)
- act_ge_property(流程引擎配置表)
- act_ge_schema_log(数据库脚本执行日志表)
- act_hi_actinst(历史的活动实例表)
- act_hi_comment(历史流程审批意见表)
- act_hi_detail(历史的流程运行详情表)
- act_hi_identitylink(历史的流程运行过程中用户表)
- act_hi_procinst(历史的流程实例表)
- act_hi_taskinst(历史的任务实例表)
- act_hi_varinst(历史的流程变量表)
- act_id_user(用户表)
- act_id_group(群组表)
- act_id_membership(用户与群组关系表)
- act_re_deployment(流程部署表)
- act_re_procdef(流程定义表)
- act_ru_ext_task(运行时外部任务表)
- act_ru_event_subscr(流程事件订阅表)
- act_ru_execution(流程运行时表)
- act_ru_identitylink(流程运行时表)
- act_ru_incident(运行时异常记录表)
- act_ru_job(流程运行时作业表)
- act_ru_jobdef(流程作业定义表)
- act_ru_task(流程运行时任务表)
- act_ru_variable(流程运行时变量表)
- Camunda SpringBoot环境搭建
- 不使用SpringBoot方式
- 测试流程xml
简介
在前面我们已经介绍了一下Camunda的基本操作:
在实际中,我们往往不会仅仅是使用,经常会遇到各种各样的问题,需要排查。(流程图问题、重跑、回退、参数各种问题、甚至还有误操作说系统有问题)
那么问题来了,我们该查那张表呢?
拿7.16版本为例,49张表,难道我们都要记住,清楚每一个细节?
这有点难度,得话时间梳理整个流程,就算梳理流程,我们也得去查对应表。
所以,我们怎样去查对应的流程涉及哪些表呢?
这就是我们这篇文章要介绍的事情,了解这些,我们以后就能快速定位数据,处理数据了。
重点关照2个事情:
- Camunda中最基本常用的表
- 不常见的流程,如何知道涉及那些表
Camunda服务
首先,我们先来了解一下Camunda提供的服务。
- ProcessEngine:流程引擎
- RepositoryService:处理流程定义文件,如部署文件等
- RuntimeService:流程实例相关,如启动流程、查询流程实例、设置获取流程实例变量等功能
- TaskService: 任务,执行节点被称为一个Task,运行时任务查询、领取、完成、删除以及变量设置等功能
- IdentityService: 用户和组的管理功能
- HistoryService: 获取正在运行或已经完成的流程实例的信息,历史信息包含已经持久化存储的永久信息,并已经被针对查询优化
- ManagementService: 流程引擎的管理和维护功能
@Resource
private ProcessEngine processEngine;
@Resource
private RepositoryService repositoryService;
@Resource
private RuntimeService runtimeService;
@Resource
private TaskService taskService;
@Resource
private IdentityService identityService;
@Resource
private HistoryService historyService;
@Resource
private ManagementService managementService;
根据流程说明Camunda最基本常用表
首先要搭建相关环境,很简单,我放在最后,如果需要可以参考。
如果完全不清楚,可以看Camunda组件与服务与基本操作里面有软件下载,到基本环境搭建。
流程部署
启动Camunda服务之后,可以在Modeler中直接部署服务,默认的部署链接:http://localhost:8088/engine-rest
注意版本,链接端口,流程图如下,相关xml我放在了最后,可根据需要自取。
部署成功之后,点击对应的链接,我们可以看到:
流程部署涉及下面3中表:
- act_re_deployment:部署记录表,每部署一次,增加一条记录
- act_re_procdef:流程定义表,每部署一次,增加一条记录,如果流程key相同,版本号递增
- act_ge_bytearray:流程部署关联的资源表
如果多次部署,想通可以,增加版本:
注意:在Camunda中REV_字段都是乐观锁的版本,VERSION_才是对应的业务版本
实例启动
实例启动之后的表数据
实例启动涉及那些常用的表呢?
![变量
注意:act_ru_xxx中的数据,流程实例结束之后都会清除,所以实例结束之后,在act_ru_xxx找不到相关数据。
select * from act_hi_actinst;
-- 记录变量变化等
select * from act_hi_detail;
-- 操作记录
select * from act_hi_op_log;
select * from act_hi_procinst;
select * from act_hi_taskinst;
select * from act_hi_varinst;
select * from act_ru_task;
select * from act_ru_variable;
select * from act_ru_execution;
-- 消息事件等
select * from act_ru_event_subscr;
完成任务之后表数据有哪些变化
我们可以通过代码的方式,完成任务。
/**
* 完成任务
*/
@Test
public void completeTask(){
Map<String,Object> map = new HashMap<>();
map.put("money",2500);
taskService.complete("d1583712-40f1-11ef-83b2-ac74b10c44ef",map);
}
我们可以看到:
至于act_hi_taskinst为什么没有变化,是因为我们没有设置任务A1的类型,所以没有记录,有兴趣的朋友可以设置完任务A1的类型再试一试。
通知接受消息节点
消息事件在act_ru_event_subscr这张表中,事件完成,就会删除对应消息事件。
/**
* 消息
*/
@Test
public void message(){
String messageName = "Message_1k6c1kv";
String processId = "d155ed1c-40f1-11ef-83b2-ac74b10c44ef";
HashMap<String, Object> params = new HashMap<>();
ExecutionQuery query = runtimeService.createExecutionQuery()
.processInstanceId(processId)
.messageEventSubscriptionName(messageName);
Execution execution = query.singleResult();
String executionId = execution.getId();
System.out.println(executionId);
// 第一种方式完成
runtimeService.messageEventReceived(messageName, executionId, params);
// 第2种方式完成
// MessageCorrelationBuilder messageCorrelation =
// runtimeService.createMessageCorrelation(messageName);
// messageCorrelation.correlate();
//第3中方式完成
// runtimeService.signal(executionId);
}
我们还可以从act_hi_detail这张表中,知道变量的变化:
如何通过服务定位相关表
前面我们知道了Camunda最基本常用的表,这里我们介绍如何通过操作去定位表。
又几个重要的类:
- CommandExecutorImpl:执行逻辑
- XXXCmd:执行命令从参数
- XXXEntity:对应的实体类
- XXXTask:具体的任务逻辑
- XXXManager:查库逻辑基本就在这里面
以完成任务为例:就是CompleteTaskCmd、TaskManager
我们知道:
taskService.complete(“d1583712-40f1-11ef-83b2-ac74b10c44ef”,map);
然后根据代码去看,容易混乱的,直接debug去跟。
这个代码看上去有没有点眼熟,这不就是MyBatis的操作嘛。
既然是MyBatis,那么Mapper文件在哪里呢?
配置文件,Mapper是不是都找到了。
camunda-engine-7.15.0.jar!\org\camunda\bpm\engine\impl\mapping\entity\Execution.xml
常用网关
这里简单介绍3个最常用的网关:
- 排他网关:多路分支,现在第1个条件未true的分支向下执行,没有设置条件默认为true
- 并行网关:多路分支并行执行,只有当多路分支都到达匹配的并行网关时才会继续向下执行
- 包容网关:排他网关和并行网关的结合体,与排他网关不同,包容网关会计算所有表达式,每一个满足条件的分支都会执行
这3个网关,都可以作为开始网关节点(fork、分支)和结束网关节点(join、汇聚)
其中,并行网关和包容网关必须有与之匹配的结束网关,因为要汇聚之后才能继续往下走。
表简介
- ACT_RE_*:Resource表示流程资源存储,包含了流程定义、图片,form
- ACT_RU_*:Runtime表示流程运行时, 包含流程实例,任务,变量,Job等运行中的数据,只在流程实例执行过程中保存这些数据
- ACT_ID_*:Identity表示组织用户信息,比如用户,组等
- ACT_HI_*:History表示流程历史记录,包含历史数据,比如历史流程实例,变量,任务等
- ACT_GE_*:General表示流程通用数据, 用于通用场景
资源相关表
分类 | 表名称 | 说明 |
---|---|---|
ACT_RE_* | act_re_camformdef | 表单定义 |
ACT_RE_* | act_re_case_def | 案例管理模型定义表 |
ACT_RE_* | act_re_decision_def | DMN决策模型定义表 |
ACT_RE_* | act_re_decision_req_def | 决策请求定义表 |
ACT_RE_* | act_re_deployment | 流程部署表 |
ACT_RE_* | act_re_procdef | BPMN流程模型定义表 |
运行时相关表
分类 | 表名称 | 说明 |
---|---|---|
ACT_RU_* | act_ru_authorization | 流程运行时收取表 |
ACT_RU_* | act_ru_batch | 流程执行批处理表 |
ACT_RU_* | act_ru_case_execution | 案例运行执行表 |
ACT_RU_* | act_ru_case_sentry_part | 案例运行哨兵表 |
ACT_RU_* | act_ru_event_subscr | 流程事件订阅表 |
ACT_RU_* | act_ru_execution | 流程运行时记录表 |
ACT_RU_* | act_ru_task | 流程运行时任务表 |
ACT_RU_* | act_ru_ext_task | 流程运行时外部任务表 |
ACT_RU_* | act_ru_task_meter_log | 运行任务计量日志 |
ACT_RU_* | act_ru_filter | 流程定义查询配置表 |
ACT_RU_* | act_ru_identitylink | 运行时流程人员表 |
ACT_RU_* | act_ru_incident | 运行时异常事件表 |
ACT_RU_* | act_ru_job | 流程运行时作业表 |
ACT_RU_* | act_ru_jobdef | 流程作业定义表 |
ACT_RU_* | act_ru_meter_log | 流程运行时度量日志表 |
ACT_RU_* | act_ru_variable | 流程运行时变量表 |
用户、组相关表
分类 | 表名称 | 说明 |
---|---|---|
ACT_ID_* | act_id_group | 群组信息表 |
ACT_ID_* | act_id_info | 用户扩展信息表 |
ACT_ID_* | act_id_membership | 用户群组关系表 |
ACT_ID_* | act_id_tenant | 租户信息表 |
ACT_ID_* | act_id_tenant_member | 用户租户关系表 |
ACT_ID_* | act_id_user | 用户信息表 |
历史数据相关表
分类 | 表名称 | 说明 |
---|---|---|
ACT_HI_* | act_hi_actinst | 历史的活动实例表 |
ACT_HI_* | act_hi_attachment | 历史的流程附件表 |
ACT_HI_* | act_hi_batch | 历史的批处理记录表 |
ACT_HI_* | act_hi_caseactinst | 历史的CMMN活动实例表 |
ACT_HI_* | act_hi_caseinst | 历史的CMMN实例表 |
ACT_HI_* | act_hi_comment | 历史的流程审批意见表 |
ACT_HI_* | act_hi_dec_in | 历史的DMN变量输入表 |
ACT_HI_* | act_hi_dec_out | 历史的DMN变量输出表 |
ACT_HI_* | act_hi_decinst | 历史的DMN实例表 |
ACT_HI_* | act_hi_detail | 历史的流程运行时变量详情记录表 |
ACT_HI_* | act_hi_ext_task_log | 历史的流程任务消息执行表 |
ACT_HI_* | act_hi_identitylink | 历史的流程运行过程中用户关系 |
ACT_HI_* | act_hi_incident | 历史的流程异常事件记录表 |
ACT_HI_* | act_hi_job_log | 历史的流程作业记录表 |
ACT_HI_* | act_hi_op_log | 历史操作日志 |
ACT_HI_* | act_hi_procinst | 历史的流程实例 |
ACT_HI_* | act_hi_taskinst | 历史的任务实例 |
ACT_HI_* | act_hi_varinst | 历史的流程变量记录表 |
通用数据相关表
分类 | 表名称 | 说明 |
---|---|---|
ACT_GE_* | act_ge_bytearray | 流程引擎二进制数据表 |
ACT_GE_* | act_ge_property | 流程引擎属性配置表 |
ACT_GE_* | act_ge_schema_log | 数据库脚本执行日志表 |
具体表说明
act_ge_bytearray(二进制数据表)
字段名称 | 字段类型 | 可否为空 | 说明 |
---|---|---|---|
ID_ | varchar(64) | 否 | 主键 |
REV_ | int(11) | 是 | 版本 |
NAME_ | varchar(255) | 是 | 名称 |
DEPLOYMENT_ID_ | varchar(64) | 是 | 部署ID |
BYTES_ | longblob | 是 | 字节内容 |
GENERATED_ | tinyint(4) | 是 | 是否系统生成(0用户创建,null系统生成) |
TENANT_ID_ | varchar(64) | 是 | 租户ID |
TYPE_ | int(11) | 是 | 类型 |
CREATE_TIME_ | datetime | 是 | 创建时间 |
ROOT_PROC_INST_ID_ | varchar(64) | 是 | 流程实例根ID |
REMOVAL_TIME_ | datetime | 是 | 删除时间 |
act_ge_property(流程引擎配置表)
字段名称 | 字段类型 | 可否为空 | 说明 |
---|---|---|---|
NAME_ | varchar(64) | 否 | 名称 |
VALUE_ | varchar(300) | 是 | 值 |
REV_ | int(11) | 是 | 版本 |
act_ge_schema_log(数据库脚本执行日志表)
字段名称 | 字段类型 | 可否为空 | 说明 |
---|---|---|---|
ID_ | varchar(64) | 否 | 主键 |
TIMESTAMP_ | datetime | 是 | 时间戳 |
VERSION_ | varchar(255) | 是 | 版本 |
act_hi_actinst(历史的活动实例表)
字段名称 | 字段类型 | 可否为空 | 说明 |
---|---|---|---|
ID_ | varchar(64) | 否 | 主键 |
PARENT_ACT_INST_ID_ | varchar(64) | 是 | 父节点实例ID |
PROC_DEF_KEY_ | varchar(255) | 是 | 流程定义KEY |
PROC_DEF_ID_ | varchar(64) | 否 | 流程定义ID |
ROOT_PROC_INST_ID_ | varchar(64) | 是 | 流程实例根ID |
PROC_INST_ID_ | varchar(64) | 否 | 流程实例ID |
EXECUTION_ID_ | varchar(64) | 否 | 执行实例ID |
ACT_ID_ | varchar(255) | 否 | 节点ID |
TASK_ID_ | varchar(64) | 是 | 任务ID |
CALL_PROC_INST_ID_ | varchar(64) | 是 | 调用外部的流程实例ID |
CALL_CASE_INST_ID_ | varchar(64) | 是 | 调用外部的案例实例ID |
ACT_NAME_ | varchar(255) | 是 | 节点名称 |
ACT_TYPE_ | varchar(255) | 否 | 节点类型 |
ASSIGNEE_ | varchar(64) | 是 | 办理人 |
START_TIME_ | datetime | 否 | 开始时间 |
END_TIME_ | datetime | 是 | 结束时间 |
DURATION_ | bigint(20) | 是 | 耗时 |
ACT_INST_STATE_ | int(11) | 是 | 活动实例状态 |
SEQUENCE_COUNTER_ | bigint(20) | 是 | 序列计数器 |
TENANT_ID_ | varchar(64) | 是 | 租户ID |
REMOVAL_TIME_ | datetime | 是 | 删除时间 |
act_hi_comment(历史流程审批意见表)
字段名称 | 字段类型 | 可否为空 | 说明 |
---|---|---|---|
ID_ | varchar(64) | 否 | 主键 |
TYPE_ | varchar(255) | 是 | 类型(event事件、comment意见) |
TIME_ | datetime | 否 | 时间 |
USER_ID_ | varchar(255) | 是 | 处理人 |
TASK_ID_ | varchar(64) | 是 | 任务ID |
ROOT_PROC_INST_ID_ | varchar(64) | 是 | 流程实例跟ID |
PROC_INST_ID_ | varchar(64) | 是 | 流程实例ID |
ACTION_ | varchar(255) | 是 | 行为类型 |
MESSAGE_ | varchar(4000) | 是 | 基本内容 |
FULL_MSG_ | longblob | 是 | 全部内容 |
TENANT_ID_ | varchar(64) | 是 | 租户ID |
REMOVAL_TIME_ | datetime | 是 | 删除时间 |
act_hi_detail(历史的流程运行详情表)
字段名称 | 字段类型 | 可否为空 | 说明 |
---|---|---|---|
ID_ | varchar(64) | 否 | 主键 |
TYPE_ | varchar(255) | 否 | 类型 |
PROC_DEF_KEY_ | varchar(255) | 是 | 流程定义KEY |
PROC_DEF_ID_ | varchar(64) | 是 | 流程定义ID |
ROOT_PROC_INST_ID_ | varchar(64) | 是 | 流程实例根ID |
PROC_INST_ID_ | varchar(64) | 是 | 流程实例ID |
EXECUTION_ID_ | varchar(64) | 是 | 流程执行ID |
CASE_DEF_KEY_ | varchar(255) | 是 | 案例定义KEY |
CASE_DEF_ID_ | varchar(64) | 是 | 案例定义ID |
CASE_INST_ID_ | varchar(64) | 是 | 案例实例ID |
CASE_EXECUTION_ID_ | varchar(64) | 是 | 案例执行ID |
TASK_ID_ | varchar(64) | 是 | 任务ID |
ACT_INST_ID_ | varchar(64) | 是 | 节点实例ID |
VAR_INST_ID_ | varchar(64) | 是 | 流程变量记录ID |
NAME_ | varchar(255) | 否 | 名称 |
VAR_TYPE_ | varchar(255) | 是 | 变量类型 |
REV_ | int(11) | 是 | 版本 |
TIME_ | datetime | 否 | 时间戳 |
BYTEARRAY_ID_ | varchar(64) | 是 | 二进制数据对应ID |
DOUBLE_ | double | 是 | double类型值 |
LONG_ | bigint(20) | 是 | long类型值 |
TEXT_ | varchar(4000) | 是 | 文本类型值 |
TEXT2_ | varchar(4000) | 是 | 文本类型值2 |
SEQUENCE_COUNTER_ | bigint(20) | 是 | 序列计数器 |
TENANT_ID_ | varchar(64) | 是 | 租户ID |
OPERATION_ID_ | varchar(64) | 是 | 操作id |
REMOVAL_TIME_ | datetime | 是 | 删除时间 |
act_hi_identitylink(历史的流程运行过程中用户表)
字段名称 | 字段类型 | 可否为空 | 说明 |
---|---|---|---|
ID_ | varchar(64) | 否 | 主键 |
TIMESTAMP_ | timestamp | 否 | 时间戳 |
TYPE_ | varchar(255) | 是 | 类型 |
USER_ID_ | varchar(255) | 是 | 用户ID |
GROUP_ID_ | varchar(255) | 是 | 用户组ID |
TASK_ID_ | varchar(64) | 是 | 任务ID |
ROOT_PROC_INST_ID_ | varchar(64) | 是 | 流程实例根ID |
PROC_DEF_ID_ | varchar(64) | 是 | 流程定义ID |
OPERATION_TYPE_ | varchar(64) | 是 | 操作类型 |
ASSIGNER_ID_ | varchar(64) | 是 | 分配者ID |
PROC_DEF_KEY_ | varchar(255) | 是 | 流程定义KEY |
TENANT_ID_ | varchar(64) | 是 | 租户ID |
REMOVAL_TIME_ | datetime | 是 | 删除时间 |
act_hi_procinst(历史的流程实例表)
字段名称 | 字段类型 | 可否为空 | 说明 |
---|---|---|---|
ID_ | varchar(64) | 否 | 主键 |
PROC_INST_ID_ | varchar(64) | 否 | 流程实例ID |
BUSINESS_KEY_ | varchar(255) | 是 | 业务KEY |
PROC_DEF_KEY_ | varchar(255) | 是 | 流程定义KEY |
PROC_DEF_ID_ | varchar(64) | 否 | 流程定义ID |
START_TIME_ | datetime | 否 | 开始时间 |
END_TIME_ | datetime | 是 | 结束时间 |
REMOVAL_TIME_ | datetime | 是 | 删除时间 |
DURATION_ | bigint(20) | 是 | 耗时 |
START_USER_ID_ | varchar(255) | 是 | 启动人ID |
START_ACT_ID_ | varchar(255) | 是 | 启动节点ID |
END_ACT_ID_ | varchar(255) | 是 | 结束节点ID |
SUPER_PROCESS_INSTANCE_ID_ | varchar(64) | 是 | 父流程实例ID |
ROOT_PROC_INST_ID_ | varchar(64) | 是 | 流程实例根ID |
SUPER_CASE_INSTANCE_ID_ | varchar(64) | 是 | 父案例实例ID |
CASE_INST_ID_ | varchar(64) | 是 | 案例实例ID |
DELETE_REASON_ | varchar(4000) | 是 | 删除原因 |
TENANT_ID_ | varchar(64) | 是 | 租户ID |
STATE_ | varchar(255) | 是 | 状态 |
act_hi_taskinst(历史的任务实例表)
字段名称 | 字段类型 | 可否为空 | 说明 |
---|---|---|---|
ID_ | varchar(64) | 否 | 主键 |
TASK_DEF_KEY_ | varchar(255) | 是 | 任务定义KEY |
PROC_DEF_KEY_ | varchar(255) | 是 | 流程定义KEY |
PROC_DEF_ID_ | varchar(64) | 是 | 流程定义ID |
ROOT_PROC_INST_ID_ | varchar(64) | 是 | 流程实例根ID |
PROC_INST_ID_ | varchar(64) | 是 | 流程实例ID |
EXECUTION_ID_ | varchar(64) | 是 | 流程执行ID |
CASE_DEF_KEY_ | varchar(255) | 是 | 案例定义KEY |
CASE_DEF_ID_ | varchar(64) | 是 | 案例定义ID |
CASE_INST_ID_ | varchar(64) | 是 | 案例实例ID |
CASE_EXECUTION_ID_ | varchar(64) | 是 | 案例执行ID |
ACT_INST_ID_ | varchar(64) | 是 | 节点实例ID |
NAME_ | varchar(255) | 是 | 名称 |
PARENT_TASK_ID_ | varchar(64) | 是 | 父任务ID |
DESCRIPTION_ | varchar(4000) | 是 | 说明 |
OWNER_ | varchar(255) | 是 | 委托人ID |
ASSIGNEE_ | varchar(255) | 是 | 办理人ID |
START_TIME_ | datetime | 否 | 开始时间 |
END_TIME_ | datetime | 是 | 结束时间 |
DURATION_ | bigint(20) | 是 | 耗时 |
DELETE_REASON_ | varchar(4000) | 是 | 删除原因 |
PRIORITY_ | int(11) | 是 | 优先级 |
DUE_DATE_ | datetime | 是 | 超时时间 |
FOLLOW_UP DATE | datetime | 是 | 跟踪时间 |
TENANT_ID_ | varchar(64) | 是 | 租户ID |
REMOVAL_TIME_ | datetime | 是 | 删除时间 |
act_hi_varinst(历史的流程变量表)
字段名称 | 字段类型 | 可否为空 | 说明 |
---|---|---|---|
ID_ | varchar(64) | 否 | 主键 |
PROC_DEF_KEY_ | varchar(255) | 是 | 流程定义KEY |
PROC_DEF_ID_ | varchar(64) | 是 | 流程定义ID |
ROOT_PROC_INST_ID_ | varchar(64) | 是 | 流程实例根ID |
PROC_INST_ID_ | varchar(64) | 是 | 流程实例ID |
EXECUTION_ID_ | varchar(64) | 是 | 流程执行ID |
ACT_INST_ID_ | varchar(64) | 是 | 节点实例ID |
CASE_DEF_KEY_ | varchar(255) | 是 | 案例定义KEY |
CASE_DEF_ID_ | varchar(64) | 是 | 案例定义ID |
CASE_INST_ID_ | varchar(64) | 是 | 案例实例ID |
CASE_EXECUTION_ID_ | varchar(64) | 是 | 案例执行ID |
TASK_ID_ | varchar(64) | 是 | 任务ID |
NAME_ | varchar(255) | 否 | 名称 |
VAR_TYPE_ | varchar(100) | 是 | 变量类型 |
CREATE_TIME_ | datetime | 是 | 创建时间 |
REV_ | int(11) | 是 | 版本 |
BYTEARRAY_ID_ | varchar(64) | 是 | 二进制数据ID |
DOUBLE_ | double | 是 | double类型值 |
LONG_ | bigint(20) | 是 | long类型值 |
TEXT_ | varchar(4000) | 是 | 文本类型值 |
TEXT2_ | varchar(4000) | 是 | 文本类型值2 |
TENANT_ID_ | varchar(64) | 是 | 租户ID |
STATE_ | varchar(20) | 是 | 状态 |
REMOVAL_TIME_ | datetime | 是 | 删除时间 |
act_id_user(用户表)
字段名称 | 字段类型 | 可否为空 | 说明 |
---|---|---|---|
ID_ | varchar(64) | 否 | 主键 |
REV_ | int(11) | 是 | 版本 |
FIRST_ | varchar(255) | 是 | 姓 |
LAST_ | varchar(255) | 是 | 名 |
EMAIL_ | varchar(255) | 是 | 邮件 |
PWD_ | varchar(255) | 是 | 密码 |
SALT_ | varchar(255) | 是 | 盐值 |
LOCK_EXP_TIME_ | datetime | 是 | 锁定过期时间 |
ATTEMPTS_ | int(11) | 是 | 尝试次数 |
PICTURE_ID_ | varchar(64) | 是 | 图片ID |
act_id_group(群组表)
字段名称 | 字段类型 | 可否为空 | 说明 |
---|---|---|---|
ID_ | varchar(64) | 否 | 主键 |
REV_ | int(11) | 是 | 版本 |
NAME_ | varchar(255) | 是 | 组名称 |
TYPE_ | varchar(255) | 是 | 组类型(SYSTEM系统、WORKFLOW业务) |
act_id_membership(用户与群组关系表)
字段名称 | 字段类型 | 可否为空 | 说明 |
---|---|---|---|
USER_ID_ | varchar(64) | 否 | 用户ID |
GROUP_ID_ | varchar(64) | 否 | 组ID |
act_re_deployment(流程部署表)
字段名称 | 字段类型 | 可否为空 | 说明 |
---|---|---|---|
ID_ | varchar(64) | 否 | 主键 |
NAME_ | varchar(255) | 是 | 流程名称 |
DEPLOY_TIME_ | datetime | 是 | 部署时间 |
SOURCE_ | varchar(255) | 是 | 来源 |
TENANT_ID_ | varchar(64) | 是 | 租户ID |
act_re_procdef(流程定义表)
字段名称 | 字段类型 | 可否为空 | 说明 |
---|---|---|---|
ID_ | varchar(64) | 否 | 主键 |
REV_ | int(11) | 是 | 版本 |
CATEGORY_ | varchar(255) | 是 | 流程定义的Namespace分类 |
NAME_ | varchar(255) | 是 | 流程定义名称 |
KEY_ | varchar(255) | 否 | 流程定义KEY |
VERSION_ | int(11) | 否 | 流程定义版本号 |
DEPLOYMENT_ID_ | varchar(64) | 是 | 部署ID |
RESOURCE_NAME_ | varchar(4000) | 是 | 资源名称 |
DGRM_RESOURCE_NAME_ | varchar(4000) | 是 | DGRM资源名称 |
HAS_START_FORM_KEY_ | tinyint(4) | 是 | 是否有启动表单 |
SUSPENSION_STATE_ | int(11) | 是 | 流程挂起 |
TENANT_ID_ | varchar(64) | 是 | 租户ID |
VERSION_TAG_ | varchar(64) | 是 | 版本标签 |
HISTORY_TTL_ | int(11) | 是 | |
STARTABLE_ | tinyint(1) | 否 | 是否是可启动流程 |
act_ru_ext_task(运行时外部任务表)
列名 | 数据类型 | 能否为空 | 说明 |
---|---|---|---|
ID_ | varchar(64) | 否 | 主键 |
REV_ | int(11) | 否 | 版本 |
WORKER_ID_ | varchar(255) | 是 | workerID |
TOPIC_NAME_ | varchar(255) | 是 | 主题 |
RETRIES_ | int(11) | 0 | 是 |
ERROR_MSG_ | varchar(4000) | 是 | 错误信息 |
ERROR_DETAILS_ID_ | varchar(64) | 是 | 错误详情ID |
LOCK_EXP_TIME_ | datetime | 0 | 是 |
SUSPENSION_STATE_ | int(11) | 是 | 挂起状态,1表示激活 |
EXECUTION_ID_ | varchar(64) | 是 | 执行ID |
PROC_INST_ID_ | varchar(64) | 是 | 流程实例ID |
PROC_DEF_ID_ | varchar(64) | 是 | 流程定义ID |
PROC_DEF_KEY_ | varchar(255) | 是 | 流程定义key |
ACT_ID_ | varchar(255) | 是 | 外部任务ID |
ACT_INST_ID_ | varchar(64) | 是 | 外部任务实例ID |
TENANT_ID_ | varchar(64) | 是 | 租户ID |
PRIORITY_ | bigint(20) | 否 | 优先级 |
act_ru_event_subscr(流程事件订阅表)
字段名称 | 字段类型 | 可否为空 | 说明 |
---|---|---|---|
ID_ | varchar(64) | 否 | 主键 |
REV_ | int(11) | 是 | 乐观锁版本 |
EVENT_TYPE_ | varchar(255) | 否 | 事件类型 |
EVENT_NAME_ | varchar(255) | 是 | 事件名称 |
EXECUTION_ID_ | varchar(64) | 是 | 执行ID |
PROC_INST_ID_ | varchar(64) | 是 | 流程实例ID |
ACTIVITY_ID_ | varchar(255) | 是 | 节点ID |
CONFIGURATION_ | varchar(255) | 是 | 配置 |
CREATED_ | datetime | 否 | 创建时间 |
TENANT_ID_ | varchar(64) | 是 | 租户ID |
act_ru_execution(流程运行时表)
字段名称 | 字段类型 | 可否为空 | 说明 |
---|---|---|---|
ID_ | varchar(64) | 否 | 主键 |
REV_ | int(11) | 是 | 版本 |
ROOT_PROC_INST_ID_ | varchar(64) | 是 | 流程实例根ID |
PROC_INST_ID_ | varchar(64) | 是 | 流程实例ID |
BUSINESS_KEY_ | varchar(255) | 是 | 业务KEY |
PARENT_ID_ | varchar(64) | 是 | 流程父实例ID |
PROC_DEF_ID_ | varchar(64) | 是 | 流程定义ID |
SUPER_EXEC_ | varchar(64) | 是 | 父流程实例对应的执行 |
SUPER_CASE_EXEC_ | varchar(64) | 是 | 父案例实例对应的执行 |
CASE_INST_ID_ | varchar(64) | 是 | 实例ID |
ACT_ID_ | varchar(255) | 是 | 节点ID |
ACT_INST_ID_ | varchar(64) | 是 | 节点实例ID |
IS_ACTIVE_ | tinyint(4) | 是 | 是否激活 |
IS_CONCURRENT_ | tinyint(4) | 是 | 是否并行 |
IS_SCOPE_ | tinyint(4) | 是 | 是否多实例范围 |
IS_EVENT_SCOPE_ | tinyint(4) | 是 | 是否事件多实例范围 |
SUSPENSION_STATE_ | int(11) | 是 | 挂起状态 |
CACHED_ENT_STATE_ | int(11) | 是 | 缓存状态 |
SEQUENCE_COUNTER_ | bigint(20) | 是 | 序列计数器 |
TENANT_ID_ | varchar(64) | 是 | 租户ID |
act_ru_identitylink(流程运行时表)
字段名称 | 字段类型 | 可否为空 | 说明 |
---|---|---|---|
ID_ | varchar(64) | 否 | 主键 |
REV_ | int(11) | 是 | 版本 |
GROUP_ID_ | varchar(255) | 是 | 用户组ID |
TYPE_ | varchar(255) | 是 | 类型 |
USER_ID_ | varchar(255) | 是 | 用户ID |
TASK_ID_ | varchar(64) | 是 | 任务ID |
PROC_DEF_ID_ | varchar(64) | 是 | 流程定义ID |
TENANT_ID_ | varchar(64) | 是 | 租户ID |
act_ru_incident(运行时异常记录表)
字段名称 | 字段类型 | 可否为空 | 说明 |
---|---|---|---|
ID_ | varchar(64) | 否 | 主键 |
REV_ | int(11) | 否 | 版本 |
INCIDENT_TIMESTAMP_ | datetime | 否 | 事件时间戳 |
INCIDENT_MSG_ | varchar(4000) | 是 | 事件信息 |
INCIDENT_TYPE_ | varchar(255) | 否 | 事件类型 |
EXECUTION_ID_ | varchar(64) | 是 | 流程执行ID |
ACTIVITY_ID_ | varchar(255) | 是 | 节点ID |
PROC_INST_ID_ | varchar(64) | 是 | 流程实例ID |
PROC_DEF_ID_ | varchar(64) | 是 | 流程定义ID |
CAUSE_INCIDENT_ID_ | varchar(64) | 是 | 事件原因ID |
ROOT_CAUSE_INCIDENT_ID_ | varchar(64) | 是 | 事件原因根ID |
CONFIGURATION_ | varchar(255) | 是 | 事件配置 |
TENANT_ID_ | varchar(64) | 是 | 租户ID |
JOB_DEF_ID_ | varchar(64) | 是 | JOB定义ID |
act_ru_job(流程运行时作业表)
字段名称 | 字段类型 | 可否为空 | 说明 |
---|---|---|---|
ID_ | varchar(64) | 否 | 主键 |
REV_ | int(11) | 是 | 版本 |
TYPE_ | varchar(255) | 否 | 类型 |
LOCK_EXP_TIME_ | datetime | 是 | 锁定过期时间 |
LOCK_OWNER_ | varchar(255) | 是 | 锁定用户 |
EXCLUSIVE_ | tinyint(1) | 是 | 独占标识 |
EXECUTION_ID_ | varchar(64) | 是 | 执行ID |
PROCESS_INSTANCE_ID_ | varchar(64) | 是 | 流程实例ID |
PROCESS_DEF_ID_ | varchar(64) | 是 | 流程定义ID |
PROCESS_DEF_KEY_ | varchar(255) | 是 | 流程定义KEY |
RETRIES_ | int(11) | 是 | 重试次数 |
EXCEPTION_STACK_ID_ | varchar(64) | 是 | 异常堆栈ID |
EXCEPTION_MSG_ | varchar(4000) | 是 | 异常信息 |
DUEDATE_ | datetime | 是 | 截止时间 |
REPEAT_ | varchar(255) | 是 | 重复 |
REPEAT_OFFSET_ | bigint(20) | 是 | |
HANDLER_TYPE_ | varchar(255) | 是 | 处理类型 |
HANDLER_CFG_ | varchar(4000) | 是 | 处理配置 |
DEPLOYMENT_ID_ | varchar(64) | 是 | 部署ID |
SUSPENSION_STATE_ | int(11) | 否 | 挂起状态 |
JOB_DEF_ID_ | varchar(64) | 是 | 作业定义ID |
PRIORITY_ | bigint(20) | 否 | 作业优先级 |
SEQUENCE_COUNTER_ | bigint(20) | 是 | 序列计数器 |
TENANT_ID_ | varchar(64) | 是 | 租户ID |
CREATE_TIME | _ datetime | 是 | 创建时间 |
act_ru_jobdef(流程作业定义表)
字段名称 | 字段类型 | 可否为空 | 说明 |
---|---|---|---|
ID_ | varchar(64) | 否 | 主键 |
REV_ | int(11) | 是 | 版本 |
PROC_DEF_ID_ | varchar(64) | 是 | 流程定义ID |
PROC_DEF_KEY_ | varchar(255) | 是 | 流程定义KEY |
ACT_ID_ | varchar(255) | 是 | 节点ID |
JOB_TYPE_ | varchar(255) | 否 | JOB类型 |
JOB_CONFIGURATION_ | varchar(255) | 是 | JOB配置 |
SUSPENSION_STATE_ | int(11) | 是 | 挂起状态 |
JOB_PRIORITY_ | bigint(20) | 是 | 优先级 |
TENANT_ID_ | varchar(64) | 是 | 租户ID |
act_ru_task(流程运行时任务表)
字段名称 | 字段类型 | 可否为空 | 说明 |
---|---|---|---|
ID_ | varchar(64) | 否 | 主键 |
REV_ | int(11) | 是 | 版本 |
EXECUTION_ID_ | varchar(64) | 是 | 流程执行ID |
PROC_INST_ID_ | varchar(64) | 是 | 流程实例ID |
PROC_DEF_ID_ | varchar(64) | 是 | 流程定义ID |
CASE_EXECUTION_ID_ | varchar(64) | 是 | 案例执行ID |
CASE_INST_ID_ | varchar(64) | 是 | 案例实例ID |
CASE_DEF_ID_ | varchar(64) | 是 | 案例定义ID |
NAME_ | varchar(255) | 是 | 名称 |
PARENT_TASK_ID_ | varchar(64) | 是 | 父任务ID |
DESCRIPTION_ | varchar(4000) | 是 | 说明 |
TASK_DEF_KEY_ | varchar(255) | 是 | 任务定义KEY |
OWNER_ | varchar(255) | 是 | 委托人 |
ASSIGNEE_ | varchar(255) | 是 | 办理人 |
DELEGATION_ | varchar(64) | 是 | 委托状态 |
PRIORITY_ | int(11) | 是 | 优先级 |
CREATE_TIME_ | datetime | 是 | 创建时间 |
DUE_DATE_ | datetime | 是 | 截止时间 |
FOLLOW_UP_DATE_ | datetime | 是 | 跟踪时间 |
SUSPENSION_STATE_ | int(11) | 是 | 挂起状态 |
TENANT_ID_ | varchar(64) | 是 | 租户ID |
act_ru_variable(流程运行时变量表)
字段名称 | 字段类型 | 可否为空 | 说明 |
---|---|---|---|
ID_ | varchar(64) | 否 | 主键 |
REV_ | int(11) | 是 | 版本 |
TYPE_ | varchar(255) | 否 | 变量类型 |
NAME_ | varchar(255) | 否 | 变量名称 |
EXECUTION_ID_ | varchar(64) | 是 | 流程执行ID |
PROC_INST_ID_ | varchar(64) | 是 | 流程实例ID |
CASE_EXECUTION_ID_ | varchar(64) | 是 | 案例执行ID |
CASE_INST_ID_ | varchar(64) | 是 | 案例实例ID |
TASK_ID_ | varchar(64) | 是 | 任务ID |
BYTEARRAY_ID_ | varchar(64) | 是 | 二进制内容ID |
DOUBLE_ | double | 是 | DOUBLE类型值 |
LONG_ | bigint(20) | 是 | LONG类型值 |
TEXT_ | varchar(4000) | 是 | 文本值 |
TEXT2_ | varchar(4000) | 是 | 文本值2 |
VAR_SCOPE_ | varchar(64) | 否 | 变量范围 |
SEQUENCE_COUNTER_ | bigint(20) | 是 | 序列计数器 |
IS_CONCURRENT_LOCAL _ | tinyint(4) | 是 | 是否并发 |
TENANT_ID_ | varchar(64) | 是 | 租户ID |
Camunda SpringBoot环境搭建
Camunda SpringBoot环境很好搭建,只需要引入相关包,配置好就可以,Camunda会自动创建相关的表。
启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
application.properties
server.port=8088
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/cda?nullDatabaseMeansCurrent=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=alice
spring.datasource.password=666
camunda.bpm.admin-user.id = demo
camunda.bpm.admin-user.password = demo
camunda.bpm.database.type=mysql
camunda.bpm.database.schema-update=true
# 自动部署 resources 下的 bpmn文件
camunda.bpm.auto-deployment-enabled=false
如果resources目录下有camunda.cfg.xml文件,会从该配置文件中加载配置信息。
pom.xml
根据实际情况调整版本:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>vip.meet</groupId>
<artifactId>camunda-learn</artifactId>
<version>1.0.0</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.4.3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.camunda.bpm</groupId>
<artifactId>camunda-bom</artifactId>
<version>7.15.0</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.camunda.bpm.springboot</groupId>
<artifactId>camunda-bpm-spring-boot-starter-rest</artifactId>
</dependency>
<dependency>
<groupId>org.camunda.bpm.springboot</groupId>
<artifactId>camunda-bpm-spring-boot-starter-webapp</artifactId>
</dependency>
<dependency>
<groupId>org.camunda.bpm</groupId>
<artifactId>camunda-engine-plugin-spin</artifactId>
</dependency>
<dependency>
<groupId>org.camunda.spin</groupId>
<artifactId>camunda-spin-dataformat-all</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.5.6</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.4.3</version>
</plugin>
</plugins>
</build>
</project>
不使用SpringBoot方式
如果,不希望使用SpringBoot方式也可以使用配置文件方式。
也非常简单:
默认配置文件方式
在resources目录下添加配置文件:activiti.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 默认id对应的值 为processEngineConfiguration -->
<bean id="processEngineConfiguration" class="org.camunda.bpm.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcDriver" value="com.mysql.cj.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/clearn?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false&nullCatalogMeansCurrent=true"/>
<property name="jdbcUsername" value="tim"/>
<property name="jdbcPassword" value="123456"/>
<property name="databaseSchemaUpdate" value="true"/>
</bean>
</beans>
@Test
public void processEngine(){
// 如果没有找到camunda.cfg.xml资源,默认引擎将搜索activiti.cfg.xml文件作为备用。
// 如果两者都缺失,引擎就会停止运行,并打印出关于缺失配置资源的错误信息。
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
System.out.println("processEngine = " + processEngine);
}
指定配置文件
可以指定配置文件路径名称:
@Test
public void initCamundaTableUseSpecficConfigFile() {
// 指定配置文件
ProcessEngineConfiguration configuration = ProcessEngineConfiguration
.createProcessEngineConfigurationFromResource("custom.cfg.xml");
ProcessEngine processEngine = configuration.buildProcessEngine();
System.out.println(processEngine);
}
通过类构造配置
@Test
public void processEngine(){
ProcessEngineConfiguration cfg = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
cfg.setJdbcUrl("jdbc:mysql://localhost:3306/camunda2?serverTimezone=UTC")
.setJdbcUsername("allen")
.setJdbcPassword("666")
.setJdbcDriver("com.mysql.cj.jdbc.Driver")
.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_FALSE)
.setHistory("full");
ProcessEngine processEngine = cfg.buildProcessEngine();
System.out.println("processEngine = " + processEngine);
}
启动中常见问题
有一个需要注意的问题是:如果没有创建表失败,可以在数据库url中添加nullDatabaseMeansCurrent=true参数。
没有成功的原因是因为在数据库链接中找到了Camunda的表,就算不是指定数据库的表,也会认为已经创建。
详细原因可以参考:Camunda创建表失败
如果遇到:historyLevel mismatch: configuration says HistoryLevelAudit(name=audit, id=2) and database says HistoryLevelFull(name=full, id=3)
这类错误,可能是因为有历史数据的原因,配置中设置historyLevel为full就可以(和数据库中act_ge_property表中保持一致),或者将原来的表全部删除就可以,让Canunda自动重建就好了。
测试流程xml
<?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_13cx61z" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.19.0" modeler:executionPlatform="Camunda Platform" modeler:executionPlatformVersion="7.15.0">
<bpmn:process id="M0001" name="我的学习流程" isExecutable="true" camunda:historyTimeToLive="180">
<bpmn:startEvent id="StartEvent_1" name="开始任务">
<bpmn:outgoing>Flow_1x0waxv</bpmn:outgoing>
</bpmn:startEvent>
<bpmn:userTask id="Activity_0gejjg7" name="任务1">
<bpmn:incoming>Flow_1x0waxv</bpmn:incoming>
<bpmn:outgoing>Flow_1wp1hf5</bpmn:outgoing>
</bpmn:userTask>
<bpmn:sequenceFlow id="Flow_1x0waxv" sourceRef="StartEvent_1" targetRef="Activity_0gejjg7" />
<bpmn:exclusiveGateway id="Gateway_1r2ry6v">
<bpmn:incoming>Flow_1wp1hf5</bpmn:incoming>
<bpmn:outgoing>Flow_1dzgh6g</bpmn:outgoing>
<bpmn:outgoing>Flow_1scwwe0</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:sequenceFlow id="Flow_1wp1hf5" sourceRef="Activity_0gejjg7" targetRef="Gateway_1r2ry6v" />
<bpmn:sequenceFlow id="Flow_1dzgh6g" sourceRef="Gateway_1r2ry6v" targetRef="Activity_16tcr5r">
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">${money > 1000}</bpmn:conditionExpression>
</bpmn:sequenceFlow>
<bpmn:sequenceFlow id="Flow_1scwwe0" sourceRef="Gateway_1r2ry6v" targetRef="Activity_0nyczt8" />
<bpmn:sequenceFlow id="Flow_0mq2usc" sourceRef="Activity_16tcr5r" targetRef="Gateway_1u148xy" />
<bpmn:sequenceFlow id="Flow_16cfig5" sourceRef="Activity_0nyczt8" targetRef="Gateway_1u148xy" />
<bpmn:inclusiveGateway id="Gateway_1u148xy">
<bpmn:incoming>Flow_0mq2usc</bpmn:incoming>
<bpmn:incoming>Flow_16cfig5</bpmn:incoming>
<bpmn:outgoing>Flow_0imrf66</bpmn:outgoing>
</bpmn:inclusiveGateway>
<bpmn:receiveTask id="Activity_0n1k9xa" name="接收通知任务" messageRef="Message_1k6c1kv">
<bpmn:incoming>Flow_0imrf66</bpmn:incoming>
<bpmn:outgoing>Flow_0dly39r</bpmn:outgoing>
</bpmn:receiveTask>
<bpmn:sequenceFlow id="Flow_0imrf66" sourceRef="Gateway_1u148xy" targetRef="Activity_0n1k9xa" />
<bpmn:endEvent id="Event_0dwjtda" name="结束任务">
<bpmn:incoming>Flow_0dly39r</bpmn:incoming>
</bpmn:endEvent>
<bpmn:sequenceFlow id="Flow_0dly39r" sourceRef="Activity_0n1k9xa" targetRef="Event_0dwjtda" />
<bpmn:userTask id="Activity_16tcr5r" name="任务A1">
<bpmn:incoming>Flow_1dzgh6g</bpmn:incoming>
<bpmn:outgoing>Flow_0mq2usc</bpmn:outgoing>
</bpmn:userTask>
<bpmn:userTask id="Activity_0nyczt8" name="任务A2">
<bpmn:incoming>Flow_1scwwe0</bpmn:incoming>
<bpmn:outgoing>Flow_16cfig5</bpmn:outgoing>
</bpmn:userTask>
</bpmn:process>
<bpmn:message id="Message_1k6c1kv" name="Message_1k6c1kv" />
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="M0001">
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
<dc:Bounds x="179" y="159" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="175" y="202" width="45" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1jlo5bs_di" bpmnElement="Activity_0gejjg7">
<dc:Bounds x="280" y="137" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_1r2ry6v_di" bpmnElement="Gateway_1r2ry6v" isMarkerVisible="true">
<dc:Bounds x="435" y="152" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_1fwmfxu_di" bpmnElement="Gateway_1u148xy">
<dc:Bounds x="805" y="152" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0zx0i8o_di" bpmnElement="Activity_0n1k9xa">
<dc:Bounds x="920" y="137" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_0dwjtda_di" bpmnElement="Event_0dwjtda">
<dc:Bounds x="1092" y="159" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1088" y="202" width="45" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1s73l33_di" bpmnElement="Activity_16tcr5r">
<dc:Bounds x="590" y="50" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0wtyptz_di" bpmnElement="Activity_0nyczt8">
<dc:Bounds x="590" y="220" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="Flow_1x0waxv_di" bpmnElement="Flow_1x0waxv">
<di:waypoint x="215" y="177" />
<di:waypoint x="280" y="177" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1wp1hf5_di" bpmnElement="Flow_1wp1hf5">
<di:waypoint x="380" y="177" />
<di:waypoint x="435" y="177" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1dzgh6g_di" bpmnElement="Flow_1dzgh6g">
<di:waypoint x="460" y="152" />
<di:waypoint x="460" y="90" />
<di:waypoint x="590" y="90" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1scwwe0_di" bpmnElement="Flow_1scwwe0">
<di:waypoint x="460" y="202" />
<di:waypoint x="460" y="260" />
<di:waypoint x="590" y="260" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0mq2usc_di" bpmnElement="Flow_0mq2usc">
<di:waypoint x="690" y="90" />
<di:waypoint x="830" y="90" />
<di:waypoint x="830" y="152" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_16cfig5_di" bpmnElement="Flow_16cfig5">
<di:waypoint x="690" y="260" />
<di:waypoint x="830" y="260" />
<di:waypoint x="830" y="202" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0imrf66_di" bpmnElement="Flow_0imrf66">
<di:waypoint x="855" y="177" />
<di:waypoint x="920" y="177" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0dly39r_di" bpmnElement="Flow_0dly39r">
<di:waypoint x="1020" y="177" />
<di:waypoint x="1092" y="177" />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>