Camunda最基本、最常用的表梳理及如何通过服务定位到相关表

简介

在前面我们已经介绍了一下Camunda的基本操作:

  1. Camunda组件与服务与基本操作
  2. Camunda ScriptTask SendTask ReceiveTask操作
  3. Camunda中强大的监听服务

在实际中,我们往往不会仅仅是使用,经常会遇到各种各样的问题,需要排查。(流程图问题、重跑、回退、参数各种问题、甚至还有误操作说系统有问题)

那么问题来了,我们该查那张表呢?

拿7.16版本为例,49张表,难道我们都要记住,清楚每一个细节?

这有点难度,得话时间梳理整个流程,就算梳理流程,我们也得去查对应表。

所以,我们怎样去查对应的流程涉及哪些表呢?

这就是我们这篇文章要介绍的事情,了解这些,我们以后就能快速定位数据,处理数据了。

重点关照2个事情:

  1. Camunda中最基本常用的表
  2. 不常见的流程,如何知道涉及那些表

Camunda服务

首先,我们先来了解一下Camunda提供的服务。

  1. ProcessEngine:流程引擎
  2. RepositoryService:处理流程定义文件,如部署文件等
  3. RuntimeService:流程实例相关,如启动流程、查询流程实例、设置获取流程实例变量等功能
  4. TaskService: 任务,执行节点被称为一个Task,运行时任务查询、领取、完成、删除以及变量设置等功能
  5. IdentityService: 用户和组的管理功能
  6. HistoryService: 获取正在运行或已经完成的流程实例的信息,历史信息包含已经持久化存储的永久信息,并已经被针对查询优化
  7. 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中表:

  1. act_re_deployment:部署记录表,每部署一次,增加一条记录
  2. act_re_procdef:流程定义表,每部署一次,增加一条记录,如果流程key相同,版本号递增
  3. act_ge_bytearray:流程部署关联的资源表

流程部署表流程定义表
资源表如果多次部署,想通可以,增加版本:
多次部署
注意:在Camunda中REV_字段都是乐观锁的版本,VERSION_才是对应的业务版本

实例启动

页面流程查看
启动流程

选择对应流程
设置流程业务key和变量
变量流程实例id
任务id

实例启动之后的表数据

实例启动涉及那些常用的表呢?

执行表
运行中任务
![变量已完成和进行中任务
用户任务
实例信息流程实例中的变量
注意: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最基本常用的表,这里我们介绍如何通过操作去定位表。

又几个重要的类:

  1. CommandExecutorImpl:执行逻辑
  2. XXXCmd:执行命令从参数
  3. XXXEntity:对应的实体类
  4. XXXTask:具体的任务逻辑
  5. XXXManager:查库逻辑基本就在这里面

以完成任务为例:就是CompleteTaskCmd、TaskManager

我们知道:

taskService.complete(“d1583712-40f1-11ef-83b2-ac74b10c44ef”,map);

然后根据代码去看,容易混乱的,直接debug去跟。
Camunda查库这个代码看上去有没有点眼熟,这不就是MyBatis的操作嘛。

既然是MyBatis,那么Mapper文件在哪里呢?
Camunda Mapper位置Camunda Mapper xml文件

配置文件,Mapper是不是都找到了。
camunda-engine-7.15.0.jar!\org\camunda\bpm\engine\impl\mapping\entity\Execution.xml

常用网关

这里简单介绍3个最常用的网关:

  1. 排他网关:多路分支,现在第1个条件未true的分支向下执行,没有设置条件默认为true
  2. 并行网关:多路分支并行执行,只有当多路分支都到达匹配的并行网关时才会继续向下执行
  3. 包容网关:排他网关和并行网关的结合体,与排他网关不同,包容网关会计算所有表达式,每一个满足条件的分支都会执行

这3个网关,都可以作为开始网关节点(fork、分支)和结束网关节点(join、汇聚)

其中,并行网关和包容网关必须有与之匹配的结束网关,因为要汇聚之后才能继续往下走。

表简介

  1. ACT_RE_*:Resource表示流程资源存储,包含了流程定义、图片,form
  2. ACT_RU_*:Runtime表示流程运行时, 包含流程实例,任务,变量,Job等运行中的数据,只在流程实例执行过程中保存这些数据
  3. ACT_ID_*:Identity表示组织用户信息,比如用户,组等
  4. ACT_HI_*:History表示流程历史记录,包含历史数据,比如历史流程实例,变量,任务等
  5. ACT_GE_*:General表示流程通用数据, 用于通用场景

资源相关表

分类表名称说明
ACT_RE_*act_re_camformdef表单定义
ACT_RE_*act_re_case_def案例管理模型定义表
ACT_RE_*act_re_decision_defDMN决策模型定义表
ACT_RE_*act_re_decision_req_def决策请求定义表
ACT_RE_*act_re_deployment流程部署表
ACT_RE_*act_re_procdefBPMN流程模型定义表

运行时相关表

分类表名称说明
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_doubledouble类型值
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 DATEdatetime跟踪时间
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_doubledouble类型值
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_datetime0
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_doubleDOUBLE类型值
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&amp;characterEncoding=utf-8&amp;serverTimezone=Asia/Shanghai&amp;useSSL=false&amp;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 &gt; 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>
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值