Skip to content

Activiti 常用类、API 与数据库表笔记

一、核心引擎与服务

类/接口说明获取方式
ProcessEngine流程引擎的入口,所有服务都从它获取ProcessEngines.getDefaultProcessEngine()
RepositoryService管理流程定义(部署、查询、删除)processEngine.getRepositoryService()
RuntimeService管理流程实例(启动、推进、变量)processEngine.getRuntimeService()
TaskService管理用户任务(查询、办理、认领、委派)processEngine.getTaskService()
HistoryService查询历史数据(实例、活动、任务)processEngine.getHistoryService()
ManagementService引擎管理与维护(作业、数据库操作)processEngine.getManagementService()

二、流程定义相关(Repository)

类/接口概念对应表
Deployment部署单元,将BPMN/XML资源加载到引擎ACT_RE_DEPLOYMENT
ProcessDefinition流程定义(抽象接口)ACT_RE_PROCDEF
ProcessDefinitionEntity流程定义的实体实现,包含BPMN解析后的完整结构ACT_RE_PROCDEF
TaskDefinition任务定义(BPMN中<userTask>的元数据),不是数据库表,而是运行时解析的结构,存储于ProcessDefinitionEntity无独立表,信息在ACT_RE_PROCDEF的字节码资源中

三、流程实例与执行相关(Runtime)

类/接口概念对应表
ProcessInstance流程实例(一次具体业务请求)ACT_RU_EXECUTION(根执行对象)
Execution执行对象,流程实例的原子分支ACT_RU_EXECUTION
Variable流程变量,上下文数据ACT_RU_VARIABLE

四、任务相关(Runtime + History)

类/接口概念对应表
Task用户任务接口(标准API)ACT_RU_TASK(运行时)<br>ACT_HI_TASKINST(历史)
TaskEntityTask接口的实体实现类,包含持久化字段ACT_RU_TASK
TaskDefinition任务定义(如任务名称、候选组、表单key),与实例无关无独立表(存储在ProcessDefinitionEntity中)
IdentityLink任务与用户/组的关联(候选人/认领人)ACT_RU_IDENTITYLINK

五、常用API示例(Java)

1. 部署流程

java
ProcessEngine pe = ProcessEngines.getDefaultProcessEngine();
RepositoryService rs = pe.getRepositoryService();
Deployment dep = rs.createDeployment()
    .addClasspathResource("process.bpmn")
    .deploy();

2. 启动流程实例

java
RuntimeService rs = pe.getRuntimeService();
ProcessInstance pi = rs.startProcessInstanceByKey("myProcessKey");

3. 查询并办理任务

java
TaskService ts = pe.getTaskService();
List<Task> tasks = ts.createTaskQuery()
    .taskAssignee("张三")
    .list();
for (Task t : tasks) {
    ts.complete(t.getId());
}

4. 获取流程定义实体

java
ProcessDefinition def = rs.createProcessDefinitionQuery()
    .processDefinitionKey("myKey")
    .latestVersion()
    .singleResult();
// 若需要 ProcessDefinitionEntity(通常无需显式使用)
// 可直接强转或通过内部服务获取

六、核心数据库表清单

分类表名说明
通用ACT_GE_BYTEARRAY存储BPMN、图片等二进制资源
ACT_GE_PROPERTY引擎属性表(版本、schema等)
流程仓库ACT_RE_DEPLOYMENT部署记录
ACT_RE_PROCDEF流程定义(含ProcessDefinitionEntity数据)
运行时ACT_RU_EXECUTION执行对象(流程实例、分支)
ACT_RU_TASK运行中的任务(对应TaskEntity
ACT_RU_VARIABLE运行时变量
ACT_RU_IDENTITYLINK任务参与者关系
ACT_RU_JOB定时/异步作业
历史ACT_HI_PROCINST历史流程实例
ACT_HI_TASKINST历史任务实例
ACT_HI_ACTINST历史活动实例(每个节点)
ACT_HI_VARINST历史变量
身份ACT_ID_USER / ACT_ID_GROUP用户/组(可选,常与外部系统集成)

七、对象关系图解

text
ProcessDefinitionEntity (1) ──► 包含多个 ──► TaskDefinition (N)

        │ 实例化

ProcessInstance ──► 当前节点 ──► TaskEntity (引用TaskDefinition)
        │                               │
        │                               └─ 对应 ACT_RU_TASK

Execution (子分支)

八、注意事项

  • TaskDefinition静态定义,描述了任务应该“长什么样”;TaskEntity运行时实例,记录了任务“当前状态”。
  • 通常情况下不需要直接操作 ProcessDefinitionEntityTaskEntity,使用 ProcessDefinitionTask 接口即可。
  • 所有 Entity 后缀的类(如 TaskEntity)都是 MyBatis 映射的持久化对象,直接操作可能绕过缓存/校验,不推荐在业务代码中使用。

九、实际流程举例:请假流程各阶段使用的对象

流程定义(BPMN)

xml
<process id="leaveProcess" name="请假流程">
  <startEvent id="start" />
  <userTask id="applyTask" name="填写请假单" assignee="${applicant}" />
  <userTask id="approveTask" name="部门经理审批" assignee="manager" />
  <endEvent id="end" />
</process>

部署后的流程定义ID:leaveProcess:1:101


阶段一:部署流程定义

操作使用的API/类核心对象数据库表
加载BPMN文件并部署RepositoryService.createDeployment().addClasspathResource().deploy()Deployment, ProcessDefinition, ProcessDefinitionEntity, ActivityImplACT_RE_DEPLOYMENT, ACT_RE_PROCDEF, ACT_GE_BYTEARRAY

内部过程

  • 解析BPMN文件生成 BpmnModel
  • 创建 ProcessDefinitionEntity(流程定义的运行时蓝图)
  • 为每个节点(startEvent, applyTask, approveTask, endEvent)创建 ActivityImpl 对象,并存储于 ProcessDefinitionEntity
  • 其中 applyTaskapproveTaskActivityImpl 内部包含 TaskDefinition(存储assignee等任务属性)

阶段二:启动流程实例

java
runtimeService.startProcessInstanceByKey("leaveProcess", "LEAVE-001");
使用的API/类核心对象数据库表
RuntimeService.startProcessInstanceByKeyProcessInstance, Execution, ActivityImpl(起始节点)ACT_RU_EXECUTION, ACT_RU_TASK, ACT_RU_VARIABLE(如有)

详细步骤与对象

  1. 创建根执行对象:引擎生成一个 Execution 对象(实现类 ExecutionImpl),同时它也是 ProcessInstance 接口的实现。

    • 插入 ACT_RU_EXECUTIONID_ = 2001PROC_INST_ID_ = 2001IS_PROCESS_INSTANCE_ = 1
  2. 获取起始节点的 ActivityImpl:从 ProcessDefinitionEntity 中根据 startEvent 的id找到对应的 ActivityImpl

  3. 执行起始节点行为:调用 startEventActivityImpl 所绑定的 ActivityBehaviorNoneStartEventActivityBehavior),将执行流转到第一个用户任务 applyTask

  4. 创建第一个用户任务:引擎找到 applyTask 对应的 ActivityImpl,其内部包含 TaskDefinition。根据 TaskDefinition 中的assignee表达式(${applicant})解析出办理人(假设流程变量中传入了applicant=张三),创建 TaskEntity 对象。

    • 插入 ACT_RU_TASKID_ = 3001TASK_DEF_KEY_ = 'applyTask'ASSIGNEE_ = '张三'EXECUTION_ID_ = 2001PROC_INST_ID_ = 2001

此时产生的对象:

  • ProcessInstance(根 ExecutionImpl,ID=2001)
  • TaskEntity(ID=3001)
  • 两个 ActivityImpl 被引用:起始节点和 applyTask

阶段三:办理第一个任务(填写请假单)

java
taskService.complete("3001");
使用的API/类核心对象数据库表
TaskService.completeTaskEntity(被完成的任务), DelegateTask, ActivityImpl(当前节点), ExecutionACT_RU_TASK(删除原任务),可能产生 ACT_HI_TASKINST, ACT_HI_ACTINST

详细步骤

  1. 查询任务taskService.createTaskQuery().taskId("3001") 返回 TaskEntity 对象(实际上包含对 ActivityImpl 的引用)。
  2. 调用完成任务
    • 引擎删除 ACT_RU_TASK 中 ID=3001 的记录
    • 将任务数据归档到 ACT_HI_TASKINSTACT_HI_ACTINST
    • 获取当前任务对应的 ActivityImpl(即 applyTask),调用其 ActivityBehaviorUserTaskActivityBehavior)的 leave 方法
  3. 流转到下一个节点:根据 applyTask 的出边(transition),找到下一个节点 approveTaskActivityImpl,执行其行为。
  4. 创建第二个任务:根据 approveTaskActivityImpl 中的 TaskDefinition(assignee固定为manager),创建新的 TaskEntity
    • 插入 ACT_RU_TASKID_ = 3002ASSIGNEE_ = 'manager'EXECUTION_ID_ = 2001(同一个执行对象)

此时对象变化:

  • 旧的 TaskEntity(3001)已被删除(历史表中保留)
  • 新的 TaskEntity(3002)被创建
  • Execution(根执行对象)的当前活动节点变为 approveTask 对应的 ActivityImpl
  • ActivityImplapplyTaskapproveTask)始终存在于 ProcessDefinitionEntity 中,被引用

阶段四:办理第二个任务(经理审批)

java
taskService.complete("3002");
使用的API/类核心对象数据库表
TaskService.completeTaskEntity, DelegateTask, ActivityImpl(当前节点), ExecutionACT_RU_TASK(删除最后任务),ACT_RU_EXECUTION(删除根执行),ACT_HI_PROCINST, ACT_HI_TASKINST, ACT_HI_ACTINST

详细步骤

  1. 完成 approveTask,引擎删除 ACT_RU_TASK 中 ID=3002 的记录。
  2. 获取 approveTask 对应的 ActivityImpl,执行其行为,流转到 endEvent
  3. 执行 endEventActivityImpl 行为(NoneEndEventActivityBehavior),结束流程实例。
  4. 清理运行时数据
    • 删除 ACT_RU_EXECUTIONPROC_INST_ID_ = 2001 的所有记录(根执行对象)
    • 删除 ACT_RU_VARIABLE 中该实例的变量(如有)
  5. 写入历史数据
    • ACT_HI_PROCINST 插入一条记录,记录开始时间、结束时间、businessKey=LEAVE-001
    • ACT_HI_TASKINST 已有两条任务历史记录
    • ACT_HI_ACTINST 记录每个活动的执行轨迹(包括 startEvent, applyTask, approveTask, endEvent)

此时运行时不再有该流程实例的任何数据。所有流程定义对象(ProcessDefinitionEntity, ActivityImpl, TaskDefinition)仍然保留在缓存中,可供新的流程实例使用。


对象生命周期总结表

对象创建时机销毁/清理时机存储位置
ProcessDefinitionEntity部署流程定义流程定义被删除或引擎重启(缓存可重新加载)内存缓存 + ACT_RE_PROCDEF
ActivityImpl部署流程定义(解析BPMN时)ProcessDefinitionEntity内存缓存(作为ProcessDefinitionEntity的一部分)
TaskDefinition部署流程定义(解析用户任务时)ProcessDefinitionEntity内存缓存(被ActivityImpl引用)
Deployment部署流程定义流程定义被删除ACT_RE_DEPLOYMENT
Execution / ProcessInstance启动流程实例流程实例结束ACT_RU_EXECUTION(运行时)<br>ACT_HI_PROCINST(历史)
TaskEntity流程流转到用户任务时任务完成时ACT_RU_TASK(运行时)<br>ACT_HI_TASKINST(历史)
DelegateTask任务监听器或办理操作中临时对象,方法结束后可被GC无持久化

一句话总结

  • 静态蓝图ProcessDefinitionEntity 包含所有 ActivityImpl(每个节点一个),用户任务的 ActivityImpl 包含 TaskDefinition
  • 运行时实例ProcessInstance(由 ExecutionImpl 实现)代表一次流程执行,TaskEntity 代表当前待办任务,它们都引用了对应的 ActivityImpl 来获取节点行为定义。