Activiti 7.1.0.M6与SpringBoot整合实战:从零搭建工作流引擎

张开发
2026/5/22 23:40:27 15 分钟阅读
Activiti 7.1.0.M6与SpringBoot整合实战:从零搭建工作流引擎
1. 环境准备与项目初始化在开始整合Activiti 7.1.0.M6之前我们需要先搭建好开发环境。我推荐使用JDK8或JDK11这两个版本在Activiti社区中经过充分验证。SpringBoot版本建议选择2.1.x系列这个版本与Activiti 7.1.0.M6兼容性最好。数据库方面MySQL 5.7或8.0都是不错的选择。开发工具我强烈推荐IntelliJ IDEA安装Activiti BPMN visualizer插件后可以直接在IDE中可视化编辑BPMN流程图。这个插件支持实时预览比用EclipseActiviti Designer要方便很多。实测下来画复杂流程图时能节省至少50%的时间。新建SpringBoot项目时记得勾选Web、JDBC和Security模块。虽然Activiti 7.x强制依赖Spring Security这点有点烦人但这是为了更好的权限控制。我在实际项目中发现如果强行排除Security依赖后面会遇到各种奇怪的权限问题。2. 依赖配置与数据库设置2.1 Maven依赖配置核心依赖只需要添加activiti-spring-boot-starter但要注意7.1.0.M6还不是正式版。如果求稳可以用7.0.0但新功能会少一些。我建议的POM配置如下dependency groupIdorg.activiti/groupId artifactIdactiviti-spring-boot-starter/artifactId version7.1.0.M6/version /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope /dependency2.2 数据库配置技巧Activiti会在启动时自动创建28张表这些表分为5大类ACT_RE_*流程定义存储ACT_RU_*运行时数据ACT_HI_*历史数据ACT_ID_*身份数据ACT_GE_*通用数据在application.yml中建议这样配置spring: datasource: url: jdbc:mysql://localhost:3306/activiti_db?useSSLfalseserverTimezoneUTC username: root password: 123456 hikari: maximum-pool-size: 15 activiti: database-schema-update: true db-history-used: true history-level: full特别提醒生产环境一定要把database-schema-update改为false否则可能被恶意用户通过流程定义注入攻击。3. 流程设计与开发实战3.1 BPMN流程图设计使用IDEA插件设计请假流程时我总结了几点经验用户任务(UserTask)必须设置Assignee或CandidateUsers网关(Gateway)要明确命名方便后期排查问题每个节点建议添加文档说明(Documentation)一个简单的请假流程BPMN代码如下process idleaveProcess name请假流程 startEvent idstart/ userTask idapply name提交申请 activiti:assignee${applicant}/ sequenceFlow sourceRefstart targetRefapply/ userTask idapprove name经理审批 activiti:candidateUsersmanager/ sequenceFlow sourceRefapply targetRefapprove/ exclusiveGateway iddecision/ sequenceFlow sourceRefapprove targetRefdecision/ sequenceFlow sourceRefdecision targetRefend conditionExpression xsi:typetFormalExpression ${approved} /conditionExpression /sequenceFlow endEvent idend/ /process3.2 服务层开发技巧RuntimeService和TaskService是最常用的两个接口。分享几个实用代码片段// 带变量启动流程 MapString, Object variables new HashMap(); variables.put(applicant, zhangsan); variables.put(days, 3); runtimeService.startProcessInstanceByKey(leaveProcess, variables); // 查询待办任务 ListTask tasks taskService.createTaskQuery() .taskCandidateOrAssigned(manager) .processDefinitionKey(leaveProcess) .list(); // 完成任务时传递审批结果 MapString, Object taskVars new HashMap(); taskVars.put(approved, true); taskService.complete(taskId, taskVars);4. 常见问题排查与性能优化4.1 启动报错解决方案经常遇到的几个问题表不存在错误检查database-schema-update是否为true权限不足检查Spring Security配置流程定义无效用activiti:checkProcessDefinitionsfalse临时关闭校验4.2 性能优化建议根据我的压测经验给出以下建议流程定义缓存调大process-definition-cache-limit500启用异步执行器async-executor-activatetrue历史级别按需设置history-levelaudit通常够用批量操作使用Bulk API数据库层面建议ACT_HI_*表可以定期归档为ACT_RU_TASK的PROC_INST_ID_字段加索引分离业务库和流程库5. 高级功能扩展5.1 动态流程处理通过RuntimeService的API可以实现动态调整// 动态添加审批节点 runtimeService.addUserIdentityLink( processInstanceId, extraApprover, IdentityLinkType.PARTICIPANT); // 动态跳转节点 runtimeService.createChangeActivityStateBuilder() .processInstanceId(processInstanceId) .moveActivityIdTo(currentTask, newTask) .changeState();5.2 自定义行为扩展通过配置ProcessEngineConfiguration可以扩展很多行为Bean public SpringProcessEngineConfiguration processEngineConfiguration( DataSource dataSource, PlatformTransactionManager transactionManager) { SpringProcessEngineConfiguration config new SpringProcessEngineConfiguration(); config.setDataSource(dataSource); config.setTransactionManager(transactionManager); // 自定义表单处理 config.setFormTypes(new CustomFormTypes()); // 自定义任务分配处理器 config.setTaskPostProcessor(new CustomTaskPostProcessor()); return config; }6. 测试与部署建议单元测试推荐使用ActivitiRuleRunWith(SpringRunner.class) SpringBootTest public class ProcessTest { Rule public ActivitiRule activitiRule new ActivitiRule(); Test public void testLeaveProcess() { // 部署流程定义 repositoryService.createDeployment() .addClasspathResource(processes/leave.bpmn20.xml) .deploy(); // 测试流程执行 ProcessInstance processInstance runtimeService .startProcessInstanceByKey(leaveProcess); assertThat(processInstance).isActive(); } }部署时要注意流程定义缓存要预热关闭自动部署auto-deployment-enabledfalse启用流程校验check-process-definitionstrue

更多文章