实习工作中需要用到工作流引擎,去实现业务审批流的功能模块,由于 Flowable 不支持 MariaDB (重要原因之一),所以项目中选择了 Camunda 工作流引擎。
由于没有接触过工作流引擎,所以打算借此机会详细记录一下这个从 0 到 1 到学习过程。
《Camunda工作流引擎一》
《Camunda工作流引擎二》
《Camunda工作流引擎三》
本篇直接从应用开始,通过切实的使用感受来达到由浅入深的效果。
Camunda 官网文档: https://docs.camunda.org/get-started/spring-boot/project-setup/
网上关于 Camunda 的中文学习资料少之又少,但是可以先学习 Activiti(教程比较多),曲线学习 Camunda。
关于工作流的一些概念和术语就不再本篇的范围了(网上很多)。
创建一个 SpringBoot 项目除了要用到的 ORM框架、数据库驱动等等,还要导入 Camunda 相关依赖:
<dependency>
<groupId>org.camunda.bpm.springbootgroupId>
<artifactId>camunda-bpm-spring-boot-starter-webappartifactId>
<version>3.4.4version>
dependency>
<dependency>
<groupId>org.camunda.bpm.springbootgroupId>
<artifactId>camunda-bpm-spring-boot-starter-restartifactId>
<version>3.4.4version>
dependency>
application.yml 部分配置:
spring:
application:
name: camunda-demo
jackson:
#设置返回前端的参数为驼峰的转换形式
property-naming-strategy: SNAKE_CASE
#日期格式化
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
#数据源配置
datasource:
url: jdbc:mysql://127.0.0.1:3306/camunda?serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 1234
mybatis:
configuration:
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
camunda:
bpm:
#配置账户密码来访问Camunda自带的管理界面
admin-user:
id: admin
password: admin
first-name: admin
filter:
create: All tasks
#指定数据库类型
# database:
# type: mysql
#禁止自动部署resources下面的bpmn文件
auto-deployment-enabled: false
#禁止index跳转到Camunda自带的管理界面,默认true
# webapp:
# index-redirect-enabled: false
启动应用,访问 http://localhost:8080 (或者其他端口) 就可以看到管理界面,使用配置的账户密码登录:
到这里就算是踏出了重要的第一步!
在成功启动 Camunda 之后,可以到数据库中看到其自动创建的 47 张表,之后每条流程实例的相关信息就会存放到这些表中!
列名 | 类型 | 长度 | 小数点 | 不是null | 主键 | 注释 |
---|---|---|---|---|---|---|
id_ | varchar | 64 | 0 | 0 | TRUE | 资源ID |
rev_ | int4 | 32 | 0 | -1 | 版本 | |
name_ | varchar | 255 | 0 | -1 | 资源名称 | |
deployment_id_ | varchar | 64 | 0 | -1 | 部署ID | |
bytes_ | bytea | 0 | 0 | -1 | 文件内容 | |
generated_ | bool | 0 | 0 | -1 | ||
tenant_id_ | varchar | 64 | 0 | -1 | 租户ID | |
type_ | int4 | 32 | 0 | -1 | 文件类型 | |
create_time_ | timestamp | 6 | 0 | -1 | 创建时间 | |
root_proc_inst_id_ | varchar | 64 | 0 | -1 | 根流程实例ID | |
removal_time_ | timestamp | 6 | 0 | -1 | 调动时间 |
列名 | 类型 | 长度 | 小数点 | 不是null | 主键 | 注释 |
---|---|---|---|---|---|---|
id_ | varchar | 64 | 0 | 0 | TRUE | 部署ID |
name_ | varchar | 255 | 0 | -1 | 部署名称 | |
deploy_time_ | timestamp | 6 | 0 | -1 | 部署时间 | |
source_ | varchar | 255 | 0 | -1 | 资源 | |
tenant_id_ | varchar | 64 | 0 | -1 | 租户ID |
列名 | 类型 | 长度 | 小数点 | 不是null | 主键 | 注释 |
---|---|---|---|---|---|---|
id_ | varchar | 64 | 0 | 0 | TRUE | 流程定义ID |
rev_ | int4 | 32 | 0 | -1 | 流程定义版本(同一个流程同一个标识) | |
category_ | varchar | 255 | 0 | -1 | 流程定义分类 | |
name_ | varchar | 255 | 0 | -1 | 流程定义名称 | |
key_ | varchar | 255 | 0 | 0 | 流程定义KEY | |
version_ | int4 | 32 | 0 | 0 | 流程定义版本(同一个流程不同的版本) | |
deployment_id_ | varchar | 64 | 0 | -1 | 流程部署ID | |
resource_name_ | varchar | 4000 | 0 | -1 | 资源名称 | |
dgrm_resource_name_ | varchar | 4000 | 0 | -1 | 流程图资源名称 | |
has_start_form_key_ | bool | 0 | 0 | -1 | 是否包含启动表单KEY(t:true;f:false) | |
suspension_state_ | int4 | 32 | 0 | -1 | 流程定义状态(激活:1/挂起:2) | |
tenant_id_ | varchar | 64 | 0 | -1 | 租户ID | |
version_tag_ | varchar | 64 | 0 | -1 | 版本标签 | |
history_ttl_ | int4 | 32 | 0 | -1 | ||
startable_ | bool | 0 | 0 | 0 |
名 | 类型 | 长度 | 小数点 | 不是null | 键 | 注释 |
---|---|---|---|---|---|---|
id_ | varchar | 64 | 0 | 0 | TRUE | 执行流ID |
rev_ | int4 | 32 | 0 | -1 | 版本 | |
root_proc_inst_id_ | varchar | 64 | 0 | -1 | 根流程实例ID | |
proc_inst_id_ | varchar | 64 | 0 | -1 | 流程实例ID | |
business_key_ | varchar | 255 | 0 | -1 | 业务KEY | |
parent_id_ | varchar | 64 | 0 | -1 | 父ID | |
proc_def_id_ | varchar | 64 | 0 | -1 | 流程定义ID | |
super_exec_ | varchar | 64 | 0 | -1 | ||
super_case_exec_ | varchar | 64 | 0 | -1 | ||
case_inst_id_ | varchar | 64 | 0 | -1 | ||
act_id_ | varchar | 255 | 0 | -1 | 节点定义ID | |
act_inst_id_ | varchar | 64 | 0 | -1 | 节点实例ID | |
is_active_ | bool | 0 | 0 | -1 | 是否可执行状态 | |
is_concurrent_ | bool | 0 | 0 | -1 | ||
is_scope_ | bool | 0 | 0 | -1 | ||
is_event_scope_ | bool | 0 | 0 | -1 | ||
suspension_state_ | int4 | 32 | 0 | -1 | 实例状态(激活:1;挂起:2) | |
cached_ent_state_ | int4 | 32 | 0 | -1 | ||
sequence_counter_ | int8 | 64 | 0 | -1 | 顺序计数器 | |
tenant_id_ | varchar | 64 | 0 | -1 | 租户ID |
运行时流程人员表,主要存储任务节点和参与者的相关信息。还有与其相对的 act_hi_identitylink
历史流程人员表。
名 | 类型 | 长度 | 小数点 | 不是null | 键 | 注释 |
---|---|---|---|---|---|---|
id_ | varchar | 64 | 0 | 0 | TRUE | 任务参与ID |
rev_ | int4 | 32 | 0 | -1 | 版本 | |
group_id_ | varchar | 255 | 0 | -1 | 角色/组ID | |
type_ | varchar | 255 | 0 | -1 | 类型(候选人:candidate;代理人:delegation) | |
user_id_ | varchar | 255 | 0 | -1 | 用户ID | |
task_id_ | varchar | 64 | 0 | -1 | 任务ID | |
proc_def_id_ | varchar | 64 | 0 | -1 | 流程定义ID | |
tenant_id_ | varchar | 64 | 0 | -1 | 租户ID |
名 | 类型 | 长度 | 小数点 | 不是null | 键 | 注释 |
---|---|---|---|---|---|---|
id_ | varchar | 64 | 0 | 0 | TRUE | 执行任务ID |
rev_ | int4 | 32 | 0 | -1 | 版本 | |
execution_id_ | varchar | 64 | 0 | -1 | 执行ID | |
proc_inst_id_ | varchar | 64 | 0 | -1 | 流程实例ID | |
proc_def_id_ | varchar | 64 | 0 | -1 | 流程定义ID | |
case_execution_id_ | varchar | 64 | 0 | -1 | ||
case_inst_id_ | varchar | 64 | 0 | -1 | ||
case_def_id_ | varchar | 64 | 0 | -1 | ||
name_ | varchar | 255 | 0 | -1 | 执行任务名称 | |
parent_task_id_ | varchar | 64 | 0 | -1 | 父级任务ID | |
description_ | varchar | 4000 | 0 | -1 | 任务描述 | |
task_def_key_ | varchar | 255 | 0 | -1 | 任务定义KEY | |
owner_ | varchar | 255 | 0 | -1 | ||
assignee_ | varchar | 255 | 0 | -1 | 签收人ID | |
delegation_ | varchar | 64 | 0 | -1 | 委托人ID | |
priority_ | int4 | 32 | 0 | -1 | 优先权 | |
create_time_ | timestamp | 6 | 0 | -1 | 创建时间 | |
due_date_ | timestamp | 6 | 0 | -1 | 到期时间 | |
follow_up_date_ | timestamp | 6 | 0 | -1 | 跟催时间 | |
suspension_state_ | int4 | 32 | 0 | -1 | 流程状态(激活:1;挂起:2) | |
tenant_id_ | varchar | 64 | 0 | -1 | 租户ID |
还有与其相对的 act_hi_varinst
历史变量表。
名 | 类型 | 长度 | 小数点 | 不是null | 键 | 注释 |
---|---|---|---|---|---|---|
id_ | varchar | 64 | 0 | 0 | TRUE | 运行变量ID |
rev_ | int4 | 32 | 0 | -1 | 版本 | |
type_ | varchar | 255 | 0 | 0 | 变量类型 | |
name_ | varchar | 255 | 0 | 0 | 变量名称 | |
execution_id_ | varchar | 64 | 0 | -1 | 执行流ID | |
proc_inst_id_ | varchar | 64 | 0 | -1 | 流程实例ID | |
case_execution_id_ | varchar | 64 | 0 | -1 | ||
case_inst_id_ | varchar | 64 | 0 | -1 | ||
task_id_ | varchar | 64 | 0 | -1 | 任务ID | |
bytearray_id_ | varchar | 64 | 0 | -1 | ||
double_ | float8 | 53 | 0 | -1 | ||
long_ | int8 | 64 | 0 | -1 | ||
text_ | varchar | 4000 | 0 | -1 | ||
text2_ | varchar | 4000 | 0 | -1 | ||
var_scope_ | varchar | 64 | 0 | -1 | ||
sequence_counter_ | int8 | 64 | 0 | -1 | 顺序计数器 | |
is_concurrent_local_ | bool | 0 | 0 | -1 | ||
tenant_id_ | varchar | 64 | 0 | -1 | 租户ID |
名 | 类型 | 长度 | 小数点 | 不是null | 键 | 注释 |
---|---|---|---|---|---|---|
id_ | varchar | 64 | 0 | 0 | TRUE | 历史流程实例ID |
proc_inst_id_ | varchar | 64 | 0 | 0 | 流程实例ID | |
business_key_ | varchar | 255 | 0 | -1 | 业务KEY | |
proc_def_key_ | varchar | 255 | 0 | -1 | 流程定义KEY | |
proc_def_id_ | varchar | 64 | 0 | 0 | 流程定义ID | |
start_time_ | timestamp | 6 | 0 | 0 | 开始时间 | |
end_time_ | timestamp | 6 | 0 | -1 | 结束时间 | |
removal_time_ | timestamp | 6 | 0 | -1 | 移除时间 | |
duration_ | int8 | 64 | 0 | -1 | 持续时间 | |
start_user_id_ | varchar | 255 | 0 | -1 | 发起人 | |
start_act_id_ | varchar | 255 | 0 | -1 | 发起节点ID | |
end_act_id_ | varchar | 255 | 0 | -1 | 结束节点ID | |
super_process_instance_id_ | varchar | 64 | 0 | -1 | 顶级流程实例ID | |
root_proc_inst_id_ | varchar | 64 | 0 | -1 | 根流程实例ID | |
super_case_instance_id_ | varchar | 64 | 0 | -1 | ||
case_inst_id_ | varchar | 64 | 0 | -1 | ||
delete_reason_ | varchar | 4000 | 0 | -1 | 删除原因 | |
tenant_id_ | varchar | 64 | 0 | -1 | 租户ID | |
state_ | varchar | 255 | 0 | -1 | 状态 |
名 | 类型 | 长度 | 小数点 | 不是null | 键 | 注释 |
---|---|---|---|---|---|---|
id_ | varchar | 64 | 0 | 0 | TRUE | 历史流程明细ID |
type_ | varchar | 255 | 0 | 0 | 类型 | |
proc_def_key_ | varchar | 255 | 0 | -1 | 流程定义KEY | |
proc_def_id_ | varchar | 64 | 0 | -1 | 流程定义ID | |
root_proc_inst_id_ | varchar | 64 | 0 | -1 | 根流程实例ID | |
proc_inst_id_ | varchar | 64 | 0 | -1 | 流程实例ID | |
execution_id_ | varchar | 64 | 0 | -1 | 执行流ID | |
case_def_key_ | varchar | 255 | 0 | -1 | ||
case_def_id_ | varchar | 64 | 0 | -1 | ||
case_inst_id_ | varchar | 64 | 0 | -1 | ||
case_execution_id_ | varchar | 64 | 0 | -1 | ||
task_id_ | varchar | 64 | 0 | -1 | 任务ID | |
act_inst_id_ | varchar | 64 | 0 | -1 | 节点实例ID | |
var_inst_id_ | varchar | 64 | 0 | -1 | 参数实例ID | |
name_ | varchar | 255 | 0 | 0 | 参数名称 | |
var_type_ | varchar | 64 | 0 | -1 | 参数类型 | |
rev_ | int4 | 32 | 0 | -1 | 版本 | |
time_ | timestamp | 6 | 0 | 0 | 时间 | |
bytearray_id_ | varchar | 64 | 0 | -1 | 流数组ID | |
double_ | float8 | 53 | 0 | -1 | ||
long_ | int8 | 64 | 0 | -1 | ||
text_ | varchar | 4000 | 0 | -1 | ||
text2_ | varchar | 4000 | 0 | -1 | ||
sequence_counter_ | int8 | 64 | 0 | -1 | 顺序计数器 | |
tenant_id_ | varchar | 64 | 0 | -1 | 租户ID | |
operation_id_ | varchar | 64 | 0 | -1 | 操作ID | |
removal_time_ | timestamp | 6 | 0 | -1 | 移除时间 |
名 | 类型 | 长度 | 小数点 | 不是null | 键 | 注释 |
---|---|---|---|---|---|---|
id_ | varchar | 64 | 0 | 0 | TRUE | 历史任务实例表ID |
task_def_key_ | varchar | 255 | 0 | -1 | 任务定义KEY | |
proc_def_key_ | varchar | 255 | 0 | -1 | 流程定义KEY | |
proc_def_id_ | varchar | 64 | 0 | -1 | 流程定义ID | |
root_proc_inst_id_ | varchar | 64 | 0 | -1 | 根流程实例ID | |
proc_inst_id_ | varchar | 64 | 0 | -1 | 流程实例ID | |
execution_id_ | varchar | 64 | 0 | -1 | 执行流ID | |
case_def_key_ | varchar | 255 | 0 | -1 | ||
case_def_id_ | varchar | 64 | 0 | -1 | ||
case_inst_id_ | varchar | 64 | 0 | -1 | ||
case_execution_id_ | varchar | 64 | 0 | -1 | ||
act_inst_id_ | varchar | 64 | 0 | -1 | 节点实例ID | |
name_ | varchar | 255 | 0 | -1 | 任务名称 | |
parent_task_id_ | varchar | 64 | 0 | -1 | 父任务ID | |
description_ | varchar | 4000 | 0 | -1 | 描述 | |
owner_ | varchar | 255 | 0 | -1 | ||
assignee_ | varchar | 255 | 0 | -1 | 代理人 | |
start_time_ | timestamp | 6 | 0 | 0 | 开始时间 | |
end_time_ | timestamp | 6 | 0 | -1 | 结束时间 | |
duration_ | int8 | 64 | 0 | -1 | 持续时间 | |
delete_reason_ | varchar | 4000 | 0 | -1 | 删除原因 | |
priority_ | int4 | 32 | 0 | -1 | 优先权 | |
due_date_ | timestamp | 6 | 0 | -1 | 到期时间 | |
follow_up_date_ | timestamp | 6 | 0 | -1 | 跟催日期 | |
tenant_id_ | varchar | 64 | 0 | -1 | 租户ID | |
removal_time_ | timestamp | 6 | 0 | -1 | 移除时间 |
名 | 类型 | 长度 | 小数点 | 不是null | 键 | 注释 |
---|---|---|---|---|---|---|
id_ | varchar | 64 | 0 | 0 | TRUE | 历史流程节点实例ID |
parent_act_inst_id_ | varchar | 64 | 0 | -1 | 父流程节点实例ID | |
proc_def_key_ | varchar | 255 | 0 | -1 | 流程定义KEY | |
proc_def_id_ | varchar | 64 | 0 | 0 | 流程定义ID | |
root_proc_inst_id_ | varchar | 64 | 0 | -1 | 根流程实例ID | |
proc_inst_id_ | varchar | 64 | 0 | 0 | 流程实例ID | |
execution_id_ | varchar | 64 | 0 | 0 | 执行流ID | |
act_id_ | varchar | 255 | 0 | 0 | 节点ID | |
task_id_ | varchar | 64 | 0 | -1 | 任务ID | |
call_proc_inst_id_ | varchar | 64 | 0 | -1 | ||
call_case_inst_id_ | varchar | 64 | 0 | -1 | ||
act_name_ | varchar | 255 | 0 | -1 | 节点名称 | |
act_type_ | varchar | 255 | 0 | -1 | 节点类型 | |
assignee_ | varchar | 64 | 0 | -1 | 代理人ID | |
start_time_ | timestamp | 6 | 0 | 0 | 开始时间 | |
end_time_ | timestamp | 6 | 0 | -1 | 结束时间 | |
duration_ | int8 | 64 | 0 | -1 | 持续时间 | |
act_inst_state_ | int4 | 32 | 0 | -1 | 节点实例状态 | |
sequence_counter_ | int8 | 64 | 0 | -1 | 顺序计数器 | |
tenant_id_ | varchar | 64 | 0 | -1 | 租户ID | |
removal_time_ | timestamp | 6 | 0 | -1 | 去除时间 |
名 | 类型 | 长度 | 小数点 | 不是null | 键 | 注释 |
---|---|---|---|---|---|---|
id_ | varchar | 64 | 0 | 0 | TRUE | 附件ID |
rev_ | int4 | 32 | 0 | -1 | 版本 | |
user_id_ | varchar | 255 | 0 | -1 | 用户ID | |
name_ | varchar | 255 | 0 | -1 | 附件名称 | |
description_ | varchar | 4000 | 0 | -1 | 附件描述 | |
type_ | varchar | 255 | 0 | -1 | 附件类型 | |
task_id_ | varchar | 64 | 0 | -1 | 任务ID | |
root_proc_inst_id_ | varchar | 64 | 0 | -1 | 根流程实例ID | |
proc_inst_id_ | varchar | 64 | 0 | -1 | 流程实例ID | |
url_ | varchar | 4000 | 0 | -1 | 附件路径 | |
content_id_ | varchar | 64 | 0 | -1 | 附件内容ID | |
tenant_id_ | varchar | 64 | 0 | -1 | 租户ID | |
create_time_ | timestamp | 6 | 0 | -1 | 创建时间 | |
removal_time_ | timestamp | 6 | 0 | -1 | 移除时间 |
名 | 类型 | 长度 | 小数点 | 不是null | 键 | 注释 |
---|---|---|---|---|---|---|
id_ | varchar | 64 | 0 | 0 | TRUE | 评论表ID |
type_ | varchar | 255 | 0 | -1 | 数据类型(任务事件记录:event;任务评论:comment) | |
time_ | timestamp | 6 | 0 | 0 | 数据产生时间 | |
user_id_ | varchar | 255 | 0 | -1 | 产生此数据用户ID | |
task_id_ | varchar | 64 | 0 | -1 | 任务ID | |
root_proc_inst_id_ | varchar | 64 | 0 | -1 | 根流程实例ID | |
proc_inst_id_ | varchar | 64 | 0 | -1 | 流程实例ID | |
action_ | varchar | 255 | 0 | -1 | 该数据的操作标识 | |
message_ | varchar | 4000 | 0 | -1 | 该评论(或者事件记录)数据的信息(文本) | |
full_msg_ | bytea | 0 | 0 | -1 | 该评论(或者事件记录)数据的信息(流) | |
tenant_id_ | varchar | 64 | 0 | -1 | 租户ID | |
removal_time_ | timestamp | 6 | 0 | -1 | 移除时间 |
除此了上述重要的表结构以外,还有很多表 act_ge_property
属性数据表存储整个流程引擎级别的数据、 act_hi_detail
历史详情表提供历史变量查询、 act_id_group
用户组信息表、 act_id_user
用户信息表、 act_id_membership
用户与用户组对应信息表、 act_ru_job
运行时定时任务数据表 等等。。。碍于篇幅就先只赘述这些开发中较为常用的表,其他的数据表用到时再去看表定义即可。
本篇重要的是成功启动应用,并对 Camunda 相关表有一个初步的印象,之后用到时不至于无从下手。
下一篇会学习到,在本应用的基础上开发一个最基本 ”流程Demo“ 的过程!
点赞+关注!评论送个人收集的Camunda学习资料+视频!
菜鸟本菜,不吝赐教,感激不尽!
更多题解源码和学习笔记:github 、CSDN 、M1ng