Activiti工作流引擎原理与使用详解

一、什么是Activiti?

Activiti 是一个开源的、基于Java的工作流与业务流程管理(BPM)平台。它支持 BPMN 2.0 标准,可以帮助企业实现流程自动化、审批流、任务分派等业务场景。Activiti易于集成到Spring、Spring Boot等主流Java框架,广泛应用于OA、ERP等系统。


二、核心概念

名称说明
流程定义BPMN文件,描述业务流程的各个节点与流转规则。
流程实例流程定义的具体一次执行过程。
任务(Task)流程中的具体操作节点,通常由用户或系统完成。
流程变量流程执行过程中传递的参数或数据。
流程部署将流程定义文件部署到引擎,成为可执行流程。
用户与组流程任务的参与者、候选人、审批人等。
事件与监听器流程执行过程中触发的事件及自定义处理逻辑。

三、核心架构与组件

  • 流程引擎:核心,负责流程定义解析、流程实例管理、任务分配等。
  • API服务
    • RepositoryService:流程定义与部署管理
    • RuntimeService:流程实例管理
    • TaskService:任务管理
    • IdentityService:用户与组管理
    • HistoryService:历史数据查询
  • 数据库:持久化流程定义、实例、任务、变量、历史数据等。
  • BPMN 2.0:流程描述语言,支持标准建模工具。

四、流程开发与运行机制

1. 流程设计

  • 使用建模工具(如Activiti Designer、Web Modeler)设计流程图,导出BPMN文件。
  • 流程图包括:开始节点、用户任务、服务任务、网关、结束节点等。

2. 流程部署

  • 将BPMN文件部署到Activiti引擎,成为可执行流程。
  • 可通过Java API、REST API等方式部署。

3. 流程启动

  • 通过流程定义Key启动流程实例,可传递业务参数(流程变量)。
  • 启动后流程实例按定义流转,自动/人工完成各节点任务。

4. 任务处理

  • 用户查询自己的待办任务,完成后流程流转到下一个节点。
  • 支持任务分配、签收、会签、加签等复杂场景。
  • 可通过表单、页面与业务系统集成。

5. 流程变量与业务数据

  • 流程变量贯穿整个流程,可用于条件判断、业务数据传递。
  • 支持与业务系统的数据同步、回写。

6. 流程查询与追踪

  • 查询流程实例状态、任务历史、流转轨迹。
  • 支持流程图高亮显示、审批流可视化。

7. 流程结束与归档

  • 流程执行到结束节点自动归档。
  • 历史数据可用于统计分析、审计。

五、常见应用场景

  • OA审批流(请假、报销、合同审批等)
  • ERP订单流程
  • 客户服务流程
  • 供应链管理流程
  • 业务自动化与集成

六、优缺点分析

优点:

  • 开源免费,社区活跃。
  • 支持BPMN 2.0标准,易于建模与扩展。
  • 与Spring生态集成良好。
  • 支持REST API,便于异构系统集成。

缺点:

  • 高并发场景性能需优化。
  • 对复杂业务规则需二次开发。
  • UI建模工具较为基础,需结合第三方平台。

七、典型开发流程(代码示例)

// 1. 部署流程定义
RepositoryService repositoryService = processEngine.getRepositoryService();
repositoryService.createDeployment()
    .addClasspathResource("processes/leave.bpmn")
    .deploy();

// 2. 启动流程实例
RuntimeService runtimeService = processEngine.getRuntimeService();
Map<String, Object> variables = new HashMap<>();
variables.put("employee", "张三");
ProcessInstance pi = runtimeService.startProcessInstanceByKey("leaveProcess", variables);

// 3. 查询并完成任务
TaskService taskService = processEngine.getTaskService();
List<Task> tasks = taskService.createTaskQuery().taskAssignee("manager").list();
for(Task task : tasks) {
    taskService.complete(task.getId(), Collections.singletonMap("approved", true));
}


七、表结构说明

1. 流程定义与部署相关表

表名说明
ACT_RE_DEPLOYMENT部署信息表,记录流程定义的部署数据。
ACT_RE_PROCDEF流程定义表,记录流程定义的基本信息(如key、版本、名称等)。
ACT_RE_MODEL流程模型表,存储通过模型编辑器设计的流程模型信息。
ACT_GE_BYTEARRAY二进制数据表,存储流程定义文件(如bpmn、png等)及表单等二进制数据。

2. 运行时数据表(正在执行的流程实例、任务等)

表名说明
ACT_RU_EXECUTION正在运行的流程实例和执行对象表,记录流程实例的执行状态。
ACT_RU_TASK正在运行的任务表,记录用户任务的状态(待办、签收等)。
ACT_RU_IDENTITYLINK运行时流程人员表,记录任务与参与者的关系(如候选人、代理人等)。
ACT_RU_VARIABLE运行时流程变量表,存储流程实例中的变量数据。
ACT_RU_JOB定时任务表,存储定时器、异步任务等信息。
ACT_RU_EVENT_SUBSCR事件订阅表,存储事件监听相关数据。

3. 历史数据表(已完成的流程、任务、变量等)

表名说明
ACT_HI_PROCINST历史流程实例表,记录已结束或正在进行的流程实例信息。
ACT_HI_ACTINST历史节点表,记录流程实例每个节点的执行历史。
ACT_HI_TASKINST历史任务表,记录历史任务的办理情况。
ACT_HI_VARINST历史变量表,记录流程实例中变量的历史数据。
ACT_HI_DETAIL历史明细表,记录流程实例的详细历史数据(如变量修改明细)。
ACT_HI_COMMENT历史意见表,记录任务办理过程中的评论、说明等。
ACT_HI_ATTACHMENT历史附件表,记录流程办理过程中的附件信息。

4. 用户与权限相关表

表名说明
ACT_ID_USER用户信息表。
ACT_ID_GROUP用户组信息表。
ACT_ID_MEMBERSHIP用户与组的关系表。
ACT_ID_INFO用户扩展信息表。

5. 其他辅助表

表名说明
ACT_GE_PROPERTY系统属性表,记录Activiti的一些全局配置信息(如版本号)。

6. 常见表用途举例

  • ACT_RU_TASK:查询当前所有待办任务。
  • ACT_HI_TASKINST:查询已办任务和任务流转历史。
  • ACT_RU_VARIABLE/ACT_HI_VARINST:查询流程变量的当前值和历史值。
  • ACT_RE_PROCDEF:查询流程定义的key、版本、部署信息等。

7. 表名命名规则

  • ACT_RE_:Repository(流程仓库/定义相关)
  • ACT_RU_:Runtime(运行时数据)
  • ACT_HI_:History(历史数据)
  • ACT_ID_:Identity(用户、组、权限)
  • ACT_GE_:General(通用数据)

备注

  • 不同版本表结构可能有细微差异,建议以实际数据库为准。
  • 生产环境可根据业务需要清理历史表数据(如ACT_HI_*),以减小数据库体积。

八、开发示例

1、工作流开发整体流程

  1. 流程设计
  2. 流程部署
  3. 流程启动
  4. 流程任务处理
  5. 流程查询与追踪
  6. 流程结束与归档

2、详细开发步骤

2.1. 流程设计

  • 使用 Activiti Designer(Eclipse 插件)、Web Modeler 或其他 BPMN 2.0 兼容工具设计流程图。
  • 保存为 BPMN 2.0 格式(.bpmn 文件)。
  • 示例流程片段:
    <process id="leaveProcess" name="请假流程" isExecutable="true">
      <startEvent id="startEvent" name="开始"/>
      <userTask id="applyTask" name="申请请假" assignee="employee"/>
      <userTask id="approveTask" name="经理审批" assignee="manager"/>
      <endEvent id="endEvent" name="结束"/>
      <!-- 连线略 -->
    </process>
    

2.2. 流程部署

  • 将设计好的 BPMN 文件部署到 Activiti 引擎。
  • 代码示例(Java):
    RepositoryService repositoryService = processEngine.getRepositoryService();
    repositoryService.createDeployment()
        .addClasspathResource("processes/leaveProcess.bpmn")
        .deploy();
    

2.3. 流程启动

  • 通过流程定义 Key 启动流程实例。
  • 可以传递业务参数(如请假天数、申请人等)。
    RuntimeService runtimeService = processEngine.getRuntimeService();
    Map<String, Object> variables = new HashMap<>();
    variables.put("employee", "张三");
    variables.put("days", 3);
    ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leaveProcess", variables);
    

2.4. 流程任务处理

  • 查询当前用户的待办任务。
    TaskService taskService = processEngine.getTaskService();
    List<Task> tasks = taskService.createTaskQuery().taskAssignee("manager").list();
    
  • 完成任务(可带参数,如审批结果)。
    Map<String, Object> variables = new HashMap<>();
    variables.put("approved", true);
    taskService.complete(task.getId(), variables);
    

2.5. 流程查询与追踪

  • 查询流程实例状态、历史任务、流转轨迹等。
    HistoryService historyService = processEngine.getHistoryService();
    List<HistoricTaskInstance> historyTasks = historyService
        .createHistoricTaskInstanceQuery()
        .processInstanceId(processInstance.getId())
        .list();
    

2.6. 流程结束与归档

  • 流程执行到结束节点自动结束。
  • 可通过监听器或定时器做归档、通知等后续操作。

3、常见扩展点

  • 流程监听器:实现流程流转时自动触发业务代码。
  • 服务任务:集成自定义 Java 代码或外部系统。
  • 表单与业务数据集成:与企业业务系统对接,动态表单、业务数据同步。
  • 权限与多实例任务:支持会签、分派等复杂场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猩火燎猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值