
简介Activiti 5.17.0 官方发布包面向 Java 后端开发者与企业级应用架构师提供完整的工作流与 BPM 平台能力可解决流程建模、任务分配、状态跟踪和自动化业务流转等核心问题。该 zip 包体约 69.35MB内含官方 jar 运行库、框架源码、使用手册等类型文件既可直接接入业务系统运行也便于通过源码理解引擎机制支持二次开发和定制。目前已有 200 余人浏览学习适合具备一定 Java 基础、希望深入掌握 BPMN 2.0 建模和 Activiti 引擎开发的技术人员。借助包内源码与手册可系统学习流程定义与模型、引擎 API、任务与工作流控制、表单关联、事件监听与事务持久化等关键内容理解 Spring 与 Hibernate 集成、RBAC 权限控制及监控报表实现思路掌握从流程设计、部署执行到运行监控的完整落地方法从而为搭建高效、可扩展的企业级业务流程管理系统提供完整参考。 做Java开发的同学应该都见过Activiti这个项目尤其是在维护老系统的场景下。activiti-5.17.0这个版本号在2014年底发布算是Activiti 5.x系列里相当成熟、使用面非常广的一个版本。直到现在很多企业的OA审批、工作流平台、工单系统仍然跑在这个版本上。这篇文章我就围绕这个版本从环境搭建、核心API使用、数据库表结构、IDEA插件离线安装到常见坑点做一个完整的实操复盘给正在使用或者准备接手这个版本项目的朋友一份可以直接参考的资料。1. 项目概述activiti-5.17.0 到底是什么1.1 版本定位与历史背景Activiti是一个开源的工作流引擎用Java编写BPMN 2.0标准是其核心能力的基础。5.17.0属于Activiti 5.x时代的中后期版本它的稳定性和社区资料丰富度都比较好。在它之后Activiti团队经历了较大的架构调整后续的6.x、7.x版本在API和内部机制上有明显变化这也导致很多老项目一直停留在5.x版本形成了大量的存量系统。5.17.0这个版本在国内企业环境中的流行程度尤其高原因有几方面一是它支持JDK 6及以上版本哪怕是老旧的服务器环境也能运行二是它的Spring集成策略比较成熟和Spring 3.x/4.x都能配合使用三是社区里积累了大量中文资料和踩坑总结上手和排错的成本相对较低。1.2 这个版本能解决什么问题假设你有一个业务系统需要实现请假审批、报销流程、合同会签等场景activiti-5.17.0可以提供这样几个核心能力流程定义管理通过BPMN 2.0 XML文件描述业务流程支持在线部署、暂停、激活。流程实例运行为每个业务请求创建一个独立的流程实例驱动任务按节点流转。任务管理待办任务、已办任务、候选人、办理人等概念开箱即用。历史记录完整留存流程实例的每一步操作方便审计和追溯。与业务系统集成通过Service API或者Spring集成把工作流嵌入到现有业务代码中。1.3 适合谁阅读如果你是刚接触Activiti的后端开发这篇文章能帮你跳过很多弯路如果你是在维护一个老项目正好碰上activiti-5.17.0相关的开发或部署工作那更可以直接对照操作。文章里涉及的内容偏向实际应用而不是单纯讲概念所以需要你有基本的Java和数据库基础不一定需要你有工作流开发经验。2. 环境搭建与关键依赖配置2.1 Maven 依赖与 JDK 适配新建一个普通的Maven项目引入activiti-engine和activiti-spring两个核心模块就行。dependency groupIdorg.activiti/groupId artifactIdactiviti-engine/artifactId version5.17.0/version /dependency dependency groupIdorg.activiti/groupId artifactIdactiviti-spring/artifactId version5.17.0/version /dependency这里有一个容易被忽略的细节activiti-engine会传递依赖很多第三方库比如MyBatis 3.2.x、Spring 3.1.x等。如果你的项目里已经用了更高版本的Spring或者MyBatis很可能会出现冲突。我的建议是优先以业务系统本身的版本为准然后把Activiti相关的依赖用exclusion排除掉再单独引入适配版本。JDK方面5.17.0官方要求JDK 6但实测在JDK 8环境下运行完全没问题。需要注意JDK 11及以上版本可能会有javax.xml.bind相关类缺失的问题因为JAXB API在JDK 11里被移除了。这类问题可以通过在pom里补上jaxb-api和jaxb-impl依赖解决。2.2 数据库选型与初始化activiti-5.17.0支持的数据库很多包括MySQL、Oracle、PostgreSQL、H2、DB2、SQL Server等。国内项目最常用的组合是MySQL 5.x版本 InnoDB引擎字符集用utf8。数据库初始化有两种方式第一种是自动建表。在构建ProcessEngine时指定databaseSchemaUpdatetrue引擎启动时会自动检查并创建缺失的Activiti表。ProcessEngineConfiguration config ProcessEngineConfiguration .createStandaloneProcessEngineConfiguration() .setJdbcUrl(jdbc:mysql://localhost:3306/activiti_db?useUnicodetruecharacterEncodingutf8) .setJdbcUsername(root) .setJdbcPassword(123456) .setDatabaseSchemaUpdate(true); ProcessEngine processEngine config.buildProcessEngine();第二种是手动建表。在activiti-engine-5.17.0.jar里找到org/activiti/db/create/目录根据自己的数据库类型选择对应的SQL脚本执行。我个人在实际项目中更推荐第二种方式原因后面在数据库章节会详细说。2.3 IDEA 插件离线安装实操Activiti在IDEA里没有一个官方长期维护的插件社区里最常用的是actiBPM它可以让你可视化查看和编辑BPMN文件。但这个插件在2018年左右基本停止了更新IDEA版本如果较新在插件市场里搜不到了只能离线安装。离线安装步骤从可靠的渠道下载actiBPM插件的zip包注意要和你的IDEA版本匹配。IDEA 2020.1之后的版本对老插件兼容性不太好可能需要手动修改插件描述文件里的idea-version参数才能装上。打开IDEA进入 File - Settings - Plugins点击右上角的齿轮图标选择“Install Plugin from Disk...”选中zip包后重启IDEA。重启后新建一个BPMN文件选择actiBPM对应的BPMN File类型双击打开就能看到可视化设计器。这里要提醒一个问题actiBPM的设计器对中文名称支持不太好流程节点ID必须是英文字母开头否则保存后重新打开会报错。我的习惯是节点ID用纯英文驼峰命名名称用中文写在name属性里。3. 核心原理与一次完整流程设计3.1 引擎启动的底层机制ProcessEngine是Activiti的心脏它本质上是把所有服务组件打包好并提供统一的创建入口。当你调用buildProcessEngine()时引擎会做这样几件事解析并加载activiti.cfg.xml如果使用Spring则是activiti-context.xml。初始化数据源检查数据库连接。根据databaseSchemaUpdate配置决定是否自动建表或校验表结构。扫描并加载act_id_*表中的用户和组数据如果开启了身份管理。初始化命令拦截器链、job executor异步任务执行器等组件。在这个过程中最容易出问题的是job executor。默认情况下它的jobExecutorActivate是关闭的如果你的流程里有定时器事件或者异步延续节点必须手动开启不然流程会卡在异步步骤上不往下走。3.2 核心 Service 的角色分工Activiti把操作能力拆成了多个Service每个Service负责一类操作Service核心职责RepositoryService管理流程定义、部署包、BPMN文件RuntimeService启动流程实例、触发信号、查询运行中的实例TaskService待办任务查询、任务签收、任务办理HistoryService查询历史流程实例、历史任务、活动记录IdentityService管理用户、组、用户与组的关系ManagementService引擎维护、Job查询、表结构元数据理解这几个Service的分工是写出清晰业务代码的关键。比如部署流程用RepositoryService发起审批用RuntimeService审批操作只用TaskService而“这个单据走到哪了”这类查询则交给HistoryService。3.3 最小闭环流程示例设计一个最简单的请假流程提交申请 - 经理审批 - 结束。BPMN文件的核心结构process idleaveProcess name请假流程 startEvent idstartEvent name开始/ userTask idmanagerTask name经理审批 activiti:assignee${manager}/ endEvent idendEvent name结束/ sequenceFlow idflow1 sourceRefstartEvent targetRefmanagerTask/ sequenceFlow idflow2 sourceRefmanagerTask targetRefendEvent/ /process部署并启动流程// 部署流程 repositoryService.createDeployment() .addClasspathResource(leave.bpmn20.xml) .name(请假流程) .deploy(); // 启动流程实例 MapString, Object vars new HashMap(); vars.put(manager, zhangsan); runtimeService.startProcessInstanceByKey(leaveProcess, vars);也就是说process id好比方法名startEvent是入口userTask是等待人工操作的任务节点。这里activiti:assignee指定了任务的办理人不是必须写死也可以用候选人组或者监听器来动态指定。办理任务taskService.complete(taskId);任务完成之后流程会顺着sequenceFlow走到下一节点如果已经到达endEvent流程实例就结束了。4. 数据库表结构与版本适配实践4.1 23 张表的作用域解析activiti-5.17.0在数据库中会创建默认前缀为ACT_的表按前缀可以分为四类ACT_GE_通用数据比如ACT_GE_BYTEARRAY存二进制大对象流程文件内容ACT_GE_PROPERTY存属性配置。ACT_RE_仓库数据比如ACT_RE_DEPLOYMENT存部署记录ACT_RE_PROCDEF存流程定义保存的是整个流程引擎范围内的流程元数据。ACT_RU_运行时数据比如ACT_RU_EXECUTION存流程实例的执行路径ACT_RU_TASK存待办任务相关数据这些数据流程结束后会被清理。ACT_HI_历史数据比如ACT_HI_PROCINST存历史流程实例ACT_HI_TASKINST存历史任务ACT_HI_ACTINST存历史节点活动记录是审计追溯的重要数据来源。我遇到不少同事问“为什么流程跑了一会儿ACT_RU_TASK里找不到任务了”原因很简单任务一旦完成Activiti就会把这条运行时记录删除同时生成一条ACT_HI_TASKINST历史记录。所以查“当前待办”看ACT_RU查“曾经做过什么”看ACT_HI。4.2 建表脚本与升级脚本的使用如果你用的是5.17.0建议以jar包内部的create脚本为准。手动建表的好处是可以先确认表创建成功再启动应用避免应用启动时因为权限不足或者字符集问题卡住。升级场景要额外注意项目如果从Activiti 5.12升级到5.17.0需要先看升级脚本目录里对应版本的增量SQL按顺序执行不能跳过。官方在org/activiti/db/upgrade/下提供了从旧版本升级到新版本的脚本比如5.15-to-5.16.sql、5.16-to-5.17.sql执行顺序一定不能乱。4.3 常见数据库问题排查第一个高发问题是MySQL建表时“Specified key was too long”。这通常是因为数据库的字符集是utf8mb4索引长度超过了限制。5.17.0默认建表语句是utf8字符集如果你的库是utf8mb4最好在建库的时候显式指定DEFAULT CHARSETutf8或者调整字段的varchar长度。第二个高频问题是启动时提示could not find table ACT_GE_PROPERTY。如果使用databaseSchemaUpdatetrue自动建表需要确认数据库账号有DDL权限如果没有DDL权限自动建表会静默失败但日志里不会直接给出具体原因。这种情况建议改用手动执行SQL脚本的方式。第三个问题是Oracle数据库下表名大小写问题。Activiti的SQL脚本对Oracle做了适配但如果你自己通过工具执行需要确认连接账号的CURRENT_SCHEMA正确否则表建到了别的用户下应用查询时就会报“表或视图不存在”。5. 常见问题与排查技巧实录5.1 插件安装失败的三种情况在IDEA里装actiBPM插件失败一般就三种情况第一种是zip包里的plugin.xml声明的idea-version since-build数值大于当前IDEA的build号。解决办法是用解压工具打开zip编辑META-INF/plugin.xml把since-build改小一点比如改成171.0然后重新打包安装。第二种是IDEA版本太新老插件无法加载。这种需要检查IDEA的版本2021之后的版本需要选择actiBPM兼容改造版或者换用其他工具如Camunda Modeler在外部编辑器里画流程然后同步回项目里。第三种是安装时提示“Plugin actiBPM is incompatible with the current version of IDEA”。这种主要是版本匹配问题优先调整plugin.xml后重新安装别直接在系统里手动拖jar文件容易造成IDEA启动异常。5.2 流程部署后查不到定义的排查流程文件部署成功但调用repositoryService.createProcessDefinitionQuery().processDefinitionKey(leaveProcess).singleResult()查不到数据需要检查两点一是部署时BPMN文件的process id与你查询的key是否一致。二是有没有添加activiti:version或者同名流程定义存在多条导致singleResult()可能因存在多条版本而抛出异常。遇到这种情况建议改用list()查询并查看ACT_RE_PROCDEF表内容确认是否存在多条相同key的记录。如果同样的key有多个版本Activiti在启动新流程实例时默认使用最高版本这是正常行为不算bug。5.3 老项目升级 5.17.0 的路径建议我接过几个从5.9、5.12升级到5.17.0的项目升级过程中最容易碰壁的是两处一是自定义命令或者自定义MyBatis映射。Activiti的MyBatis映射文件在版本间偶尔有字段调整如果你的项目里写了基于Activiti内部表的SQL需要在升级后回归测试。二是与Spring版本的冲突。5.x系列对Spring版本比较敏感如果项目用了Spring 4以上的版本可能出现NoSuchMethodError或ClassNotFoundError。这时尽量参考activiti-spring依赖中声明的Spring版本统一项目Spring版本。升级顺序建议是先备份数据库 - 备份原有依赖清单 - 执行中间版本升级SQL - 替换依赖 - 跑一遍完整的流程回归用例。不要直接跨大版本跃升稳妥一点更重要。6. 一些实际维护经验补充说句实在话activiti-5.17.0现在不算新东西了但它的设计思路放在今天依然清晰。引擎的Service拆分、数据库表的分层设计、BPMN 2.0标准的支持程度对于中小型项目的业务流程落地来说完全够用。如果项目还有较长的维护周期我建议在代码里对Activiti的Service调用做一层防腐封装。也就是说业务代码不要直接散落地调用taskService.complete()而是通过自己定义的ApprovalService接口集中处理。这样即使未来要把引擎替换成Flowable或者Activiti 7对上层业务的影响会小很多。另外一个容易被忽略的点是流程文件的版本管理。BPMN的XML文件一定要纳入Git管理并且做到和代码版本同步发布。我见过不少项目代码回滚了但流程文件还是新版本导致新旧逻辑混用排查起来特别头疼。如果你正在跟这个版本打交道或者正准备接手一个基于activiti-5.17.0的系统希望这篇文章能给你一些实在的参考。工作流引擎本身不复杂复杂的是流程和业务的边界划分把引擎当作基础设施来用把精力放在业务抽象上项目会清爽很多。本文还有配套的精品资源点击获取