当前位置:首页 > 技术 > 正文内容

Activiti 6.x 工作流引擎实践指南

访客 技术 2026年10月3日 2

在构建具备多级审批能力的企业级系统(如安防门禁管控平台)时,硬编码状态流转难以应对流程变更、审计追溯与可视化监控等需求。为此,引入标准化工作流引擎成为关键决策。本文聚焦 Activiti 6.x 版本,围绕其核心机制、集成方式与典型用例展开技术实践说明。

框架选型依据

对比主流开源流程引擎,Activiti 在轻量性、Spring 生态兼容性及社区活跃度方面表现突出。相较于 jBPM,其采用 MyBatis 实现高效 SQL 控制,原生支持 Spring Boot 自动装配,且提供完整的 REST API 与 Web 管理界面(Activiti Explorer),更适合快速嵌入已有 Java EE 架构中。Activiti 6.x 作为稳定分支,在 BPMN 2.0 规范支持、事务一致性及历史数据分离策略上已趋于成熟,因此被选定为项目基础流程支撑组件。

核心概念解析

  • BPM(业务流程管理):一种以端到端流程建模、执行、监控与优化为核心的管理方法论,强调跨系统、跨角色的协同自动化。
  • BPMN 2.0:由 OMG 组织制定的图形化建模标准,定义了活动(Activity)、网关(Gateway)、事件(Event)和连接线(Sequence Flow)等语义元素,确保流程设计可执行、可理解、可交换。
  • 流程生命周期:涵盖模型设计(Modeling)、部署(Deployment)、实例启动(Start)、任务执行(Task Handling)、运行监控(Monitoring)与持续优化(Optimization)五个阶段。

Activiti 引擎架构概览

Activiti 以模块化方式组织功能,核心组件包括:

  • ProcessEngine:主入口对象,用于获取全部服务接口;
  • RepositoryService:管理 BPMN 流程定义、资源文件与版本控制;
  • RuntimeService:启动/查询流程实例、传递流程变量、挂起/激活流程;
  • TaskService:处理用户任务生命周期,包括分配、签收、完成与委托;
  • HistoryService:访问已完成流程的历史记录,支持审计与报表生成;
  • ManagementService:提供作业(Job)、数据库元信息、引擎配置等运维级操作。

开发环境搭建要点

使用 Maven 管理依赖,引入 Activiti 6.0.0 核心模块:

<dependency>
  <groupId>org.activiti</groupId>
  <artifactId>activiti-engine</artifactId>
  <version>6.0.0</version>
</dependency>
<dependency>
  <groupId>com.h2database</groupId>
  <artifactId>h2</artifactId>
  <scope>runtime</scope>
</dependency>

最小化配置示例如下(基于内存 H2 数据库):

<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">

  <bean id="processEngineConfiguration" 
        class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
    <property name="jdbcUrl" value="jdbc:h2:mem:activiti;DB_CLOSE_DELAY=-1" />
    <property name="jdbcDriver" value="org.h2.Driver" />
    <property name="databaseSchemaUpdate" value="true" />
    <property name="history" value="full" />
  </bean>

</beans>

请假审批流程实战

以下代码演示一个简化版两级审批流程:员工提交申请 → 部门负责人审批 → 流程结束。流程定义文件 leave2.bpmn.xml 包含 StartEvent、UserTask("领导审批")、ExclusiveGateway(判断是否通过)及 EndEvent。

@Test
public void executeLeaveApprovalFlow() {
  // 初始化独立内存引擎
  ProcessEngine engine = ProcessEngineConfiguration
      .createStandaloneInMemProcessEngineConfiguration()
      .buildProcessEngine();

  RepositoryService repo = engine.getRepositoryService();
  RuntimeService runtime = engine.getRuntimeService();
  TaskService taskSvc = engine.getTaskService();
  HistoryService history = engine.getHistoryService();

  // 部署流程定义
  repo.createDeployment()
      .addInputStream("leave2.bpmn", getClass().getResourceAsStream("/leave2.bpmn.xml"))
      .deploy();

  // 启动流程实例并传入变量
  Map<String, Object> vars = new HashMap<>();
  vars.put("applicant", "zhangsan");
  vars.put("durationDays", 5);
  ProcessInstance instance = runtime.startProcessInstanceByKey("leave2", vars);

  // 查询待处理任务(候选人组:deptLeader)
  Task approvalTask = taskSvc.createTaskQuery()
      .taskCandidateGroup("deptLeader")
      .singleResult();
  
  assertNotNull(approvalTask);
  assertEquals("领导审批", approvalTask.getName());

  // 签收并完成任务
  taskSvc.claim(approvalTask.getId(), "li4");
  Map<String, Object> outcome = new HashMap<>();
  outcome.put("isApproved", true);
  taskSvc.complete(approvalTask.getId(), outcome);

  // 验证流程是否成功结束
  long finishedCount = history.createHistoricProcessInstanceQuery()
      .finished()
      .count();
  assertEquals(1L, finishedCount);
}

执行后输出流程实例 ID 与定义 ID,表明流程已按 BPMN 图正确流转并终止。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。