BPM引擎系列(三) Flowable实战-Activiti分家后的升级版
Flowable实战——Activiti分家后的升级版系列第三篇Flowable 6.x Spring Boot 集成看看原班人马搞出来的升级版到底强在哪。一、Activiti 团队为啥分家了上篇咱们把Activiti跑起来了但评论区肯定有人要问了“Activiti 7 都不怎么维护了为啥不直接用 Flowable”这个问题得从历史说起。2010年Tom Baeyens 创建了 Activiti后来去了 Alfresco。2016年左右Activiti 核心开发团队里的一部分人包括 Tijs Rademakers觉得 Activiti 6 的发展方向不太对于是**分家出来创建了 Flowable**。Activiti 5/6 核心团队 │ ├──→ 留在 Alfresco → Activiti 7 (TOMATO) │ └──→ 出来单干 → Flowable 6/7分家的核心原因Activiti 7 开始往云原生、微服务方向转TOMATO项目和原来的轻量级引擎定位不同Flowable 团队想继续把 BPM 引擎本身做好保持轻量、灵活所以 Flowable 可以理解为“Activiti 的精神续作”——API兼容但功能更强、Bug修得更快。二、Flowable vs Activiti代码层面差多少先说结论如果你会 Activiti学 Flowable 几乎零成本。2.1 依赖对比ActivitidependencygroupIdorg.activiti/groupIdartifactIdactiviti-spring-boot-starter/artifactIdversion7.1.0.M6/version/dependencyFlowabledependencygroupIdorg.flowable/groupIdartifactIdflowable-spring-boot-starter/artifactIdversion6.8.0/version/dependency就改个 groupId 和 artifactId版本号不同其他套路一模一样。2.2 配置对比Activiti 的 application.ymlactiviti:database-schema-update:truecheck-process-definitions:trueprocess-definition-location-prefix:classpath:/processes/history-level:fullFlowable 的 application.ymlflowable:database-schema-update:truecheck-process-definitions:trueprocess-definition-location-prefix:classpath:/processes/history-level:full区别前缀从activiti:变成了flowable:其他完全一样。2.3 BPMN 文件对比Activitidefinitionsxmlns:activitihttp://activiti.org/bpmnuserTaskactiviti:assignee${managerId}/serviceTaskactiviti:expression${hrService.record(execution)}//definitionsFlowabledefinitionsxmlns:flowablehttp://flowable.org/bpmnuserTaskflowable:assignee${managerId}/serviceTaskflowable:expression${hrService.record(execution)}//definitions区别命名空间从activiti:变成了flowable:其他完全一样。2.4 Java API 对比Activitiimportorg.activiti.engine.RuntimeService;importorg.activiti.engine.TaskService;importorg.activiti.engine.runtime.ProcessInstance;importorg.activiti.engine.task.Task;Flowableimportorg.flowable.engine.RuntimeService;importorg.flowable.engine.TaskService;importorg.flowable.engine.runtime.ProcessInstance;importorg.flowable.task.api.Task;区别包名从org.activiti变成了org.flowable类名和方法名完全一样。说白了把代码里的activiti全局替换成flowable项目就能跑起来。三、Flowable 的增强特性如果只是改个名字那Flowable也没啥好说的。关键是Flowable在Activiti的基础上加了不少实用功能。3.1 更完善的 REST APIFlowable 内置了 REST API虽然咱们这篇主要讲Spring Boot集成但这个值得一提# Flowable 自带 REST APIGET /flowable-rest/service/runtime/process-instances GET /flowable-rest/service/runtime/tasks POST /flowable-rest/service/runtime/tasks/{taskId}Activiti 7 也有 REST API但 Flowable 的文档更全、接口更稳定。3.2 动态表单支持Flowable 支持在流程定义里直接配置表单userTaskidmanager-approvalname经理审批flowable:assignee${managerId}extensionElementsflowable:formPropertyidapprovedname审批结果typebooleanrequiredtrue/flowable:formPropertyidcommentname审批意见typestring//extensionElements/userTask这样前端就可以根据流程定义动态渲染表单不用硬编码。3.3 事件监听器Flowable 支持更灵活的事件监听ComponentpublicclassMyEventListenerimplementsFlowableEventListener{OverridepublicvoidonEvent(FlowableEventevent){if(event.getType()FlowableEngineEventType.TASK_CREATED){// 任务创建时发送通知TaskEntitytask(TaskEntity)((FlowableEntityEvent)event).getEntity();log.info(新任务创建: {}, 处理人: {},task.getName(),task.getAssignee());}}OverridepublicbooleanisFailOnException(){returnfalse;}OverridepublicbooleanisFireOnTransactionLifecycleEvent(){returnfalse;}OverridepublicStringgetOnTransaction(){returnnull;}}3.4 异步历史数据Flowable 支持异步处理历史数据提升运行时性能flowable:async-history-enabled:trueasync-history-executor-activate:true这样流程执行时不用等历史数据写入响应更快。四、Spring Boot 集成 Flowable好了理论说完咱们上代码。因为API和Activiti几乎一样我重点讲差异和增强点。4.1 项目结构flowable-demo/ ├── pom.xml ├── src/main/resources/ │ ├── application.yml │ └── processes/leave-process.bpmn20.xml └── src/main/java/com/example/flowable/ ├── FlowableDemoApplication.java ├── controller/LeaveController.java └── service/ ├── HrService.java └── EmailService.java发现和 Activiti 的项目结构几乎一样没错就是复制粘贴改个包名的事。4.2 核心代码启动流程RestControllerRequestMapping(/api/leave)publicclassLeaveController{AutowiredprivateRuntimeServiceruntimeService;// 包名是 org.flowable.engineAutowiredprivateTaskServicetaskService;PostMapping(/start)publicMapString,ObjectstartProcess(RequestParamStringapplicant,RequestParamStringmanagerId,RequestParamStringdirectorId,RequestParamIntegerdays){MapString,ObjectvariablesnewHashMap();variables.put(applicant,applicant);variables.put(managerId,managerId);variables.put(directorId,directorId);variables.put(days,days);// 和 Activiti 一模一样的 APIProcessInstanceinstanceruntimeService.startProcessInstanceByKey(leave-process,variables);returnMap.of(processInstanceId,instance.getId(),message,请假流程已启动);}}查询待办、完成任务代码和 Activiti 完全一样就不重复贴了。完整版见配套源码。4.3 服务任务实现Service(hrService)publicclassHrService{publicvoidrecord(DelegateExecutionexecution){// 注意这里的 DelegateExecution 是 org.flowable.engine.delegate.DelegateExecutionStringapplicant(String)execution.getVariable(applicant);Integerdays(Integer)execution.getVariable(days);log.info(【HR备案】员工 {} 请假 {} 天已记录,applicant,days);}}唯一的区别DelegateExecution的包名从org.activiti变成了org.flowable。五、从 Activiti 迁移到 Flowable如果你已经在用 Activiti想迁移到 Flowable步骤如下Step 1替换依赖!-- 删除 --dependencygroupIdorg.activiti/groupIdartifactIdactiviti-spring-boot-starter/artifactId/dependency!-- 替换为 --dependencygroupIdorg.flowable/groupIdartifactIdflowable-spring-boot-starter/artifactIdversion6.8.0/version/dependencyStep 2修改配置文件把application.yml里的activiti:改成flowable:。Step 3修改 BPMN 命名空间把 BPMN 文件里的xmlns:activiti改成xmlns:flowable所有activiti:前缀改成flowable:。可以用 IDE 的全局替换一键搞定。Step 4修改 Java 包名把代码里的org.activiti替换成org.flowable。Step 5数据库迁移Flowable 的表结构和 Activiti 基本一致毕竟同源但有一些差异Flowable 6.x 的表名也是ACT_*前缀启动时设置flowable.database-schema-update: trueFlowable 会自动处理表结构差异建议先在测试环境跑一遍确认数据没问题再上生产迁移成本评估纯 API 使用很低改包名就行有自定义SQL查Activiti表中等需要核对表字段差异用了Activiti的高级特性如IdentityService大量操作较高需要测试验证六、跑起来测试6.1 启动应用cdflowable-demo mvn spring-boot:run端口是 8082和 Activiti 的 8081 区分开。6.2 API 测试和 Activiti 的测试流程完全一样# 启动流程curl-XPOSThttp://localhost:8082/api/leave/start\-dapplicant小红\-dmanagerIdmanager-zhang\-ddirectorIddirector-li\-ddays5# 查经理待办curlhttp://localhost:8082/api/leave/tasks?assigneemanager-zhang# 经理通过curl-XPOSThttp://localhost:8082/api/leave/complete\-dtaskIdxxx\-dapprovedtrue6.3 单元测试mvntest三个测试场景和 Activiti 完全一致短假2天经理通过 → 流程结束长假5天经理通过 → 总监通过 → 流程结束经理驳回 → 流程结束七、Flowable 的优缺点优点✅ API 和 Activiti 高度兼容迁移成本低✅ 社区更活跃Bug修复更快✅ 功能更丰富动态表单、事件监听、异步历史等✅ 文档质量高✅ 同时支持BPMN、CMMN案例管理、DMN决策表缺点❌ 相比 Activiti名气稍小但正在追赶❌ 没有 Camunda 那样强大的 Web 管理界面❌ 企业版Flowable Work功能更全但社区版有些功能受限八、小结这篇咱们聊了Flowable 的身世——Activiti 原班人马分家后的作品和 Activiti 的代码对比——改个包名就能跑几乎零成本Flowable 的增强特性——动态表单、事件监听、异步历史迁移指南——5步从 Activiti 迁到 Flowable跑通测试——同样的请假流程同样的API下一篇预告企业级 BPM 的专业选手——Camunda。它不仅有引擎还有强大的 Web 监控界面 Cockpit咱们来看看怎么玩。配套源码本文完整源码位于03-flowable-demo/包含完整的pom.xml和application.yml请假流程 BPMN 定义Flowable 命名空间REST API Controller服务任务实现单元测试3个场景全覆盖你从 Activiti 迁移到 Flowable 过吗遇到过什么坑欢迎交流