Activiti工作流模型部署全解析(附实战代码)

从0到1:Activiti工作流模型部署全解析(附实战代码)

在企业级应用开发中,工作流引擎是实现业务流程自动化的核心组件,而Activiti作为开源工作流领域的标杆框架,其模型部署机制直接决定了流程从设计到落地的效率。本文将基于Activiti的核心API,从模型部署的底层逻辑、完整流程到实战代码,带你全方位掌握这一关键操作。

一、模型部署的核心本质

模型部署是连接“流程设计”与“流程执行”的桥梁。在Activiti生态中,我们通过Modeler设计的流程模型(存储于act_re_model表)仅为“设计草稿”,需经过部署流程将其转换为可执行的流程定义(存储于act_re_procdef表),才能启动流程实例并执行业务逻辑。

简单来说,部署过程的核心是将JSON格式的模型配置转换为BPMN 2.0标准格式,并在Activiti的数据库中生成对应的部署记录、流程定义及二进制资源,形成完整的执行链路。

二、模型部署的核心流程与数据流向

Activiti的模型部署并非单一操作,而是涉及多表联动、格式转换的完整流程,其核心数据流向如下:

1. 数据准备:从数据库读取模型基础信息

部署的第一步是获取已设计完成的模型数据,包括两部分核心内容:

  • 模型元信息:从act_re_model表读取模型名称、标识(key)、分类等基础属性,通过repositoryService.getModel(modelId)实现;
  • 模型编辑器内容:从act_ge_bytearray表读取JSON格式的流程设计数据,通过repositoryService.getModelEditorSource(modelId)获取二进制流。

2. 格式转换:JSON转BPMNModel

模型设计器存储的JSON数据无法直接被Activiti执行,需通过BpmnJsonConverter工具类转换为框架可识别的BpmnModel对象。这一步是部署的核心,负责将可视化设计的节点、连线、网关等元素,映射为符合BPMN 2.0规范的流程定义结构。

3. 部署执行:生成流程定义与部署记录

通过repositoryService.createDeployment()构建部署构建器,设置部署名称、分类、标识等属性,并将BpmnModel对象以XXX.bpmn20.xml的格式添加到部署中,最终调用deploy()方法完成部署。

这一步会在数据库中生成三条关键数据:

  • act_re_deployment:存储部署记录,生成唯一部署ID;
  • act_re_procdef:存储可执行的流程定义,关联部署ID,是启动流程实例的核心依据;
  • act_ge_bytearray:存储BPMN文件的二进制内容,与模型编辑器内容分属不同记录。

4. 关联更新:绑定模型与部署ID

部署完成后,需将生成的部署ID(deploy.getId())赋值给模型对象,并通过repositoryService.saveModel(model)更新act_re_model表的DEPLOYMENT_ID_字段,实现模型与部署记录的关联,便于后续追溯和管理。

三、实战代码:标准化模型部署接口

基于Activiti 7.x版本,以下是优化后的标准化模型部署接口,解决了原代码中冗余保存、异常处理不规范等问题:

importorg.activiti.bpmn.model.BpmnModel;importorg.activiti.engine.RepositoryService;importorg.activiti.engine.repository.Deployment;importorg.activiti.engine.repository.Model;importorg.activiti.editor.language.json.converter.BpmnJsonConverter;importcom.fasterxml.jackson.databind.JsonNode;importcom.fasterxml.jackson.databind.ObjectMapper;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.PathVariable;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.ResponseBody;importorg.springframework.web.bind.annotation.RestController;/** * 工作流模型部署接口 */@RestControllerpublicclassModelDeploymentController{@AutowiredprivateRepositoryServicerepositoryService;@AutowiredprivateObjectMapperobjectMapper;/** * 模型部署:将设计好的模型转换为可执行流程定义 * @param modelId 模型ID(act_re_model表主键) * @return 部署结果 */@RequestMapping("/deploy/{modelId}")@ResponseBodypublicAjaxResultmodelDeployment(@PathVariableStringmodelId){// 校验模型ID合法性if(modelId==null||modelId.trim().isEmpty()){returnAjaxResult.error("模型ID不能为空");}try{// 1. 获取模型元信息与编辑器内容Modelmodel=repositoryService.getModel(modelId);if(model==null){returnAjaxResult.error("未找到指定模型");}byte[]modelData=repositoryService.getModelEditorSource(modelId);if(modelData==null||modelData.length==0){returnAjaxResult.error("模型内容为空,请完善流程设计");}// 2. JSON格式转换为BPMNModelJsonNodejsonNode=objectMapper.readTree(modelData);BpmnJsonConverterbpmnJsonConverter=newBpmnJsonConverter();BpmnModelbpmnModel=bpmnJsonConverter.convertToBpmnModel(jsonNode);// 校验BPMN模型合法性(避免无效流程部署)if(bpmnModel.getProcesses().isEmpty()){returnAjaxResult.error("流程模型中未包含有效流程,无法部署");}// 3. 执行部署操作Deploymentdeploy=repositoryService.createDeployment().category(model.getCategory())// 继承模型分类.name(model.getName())// 继承模型名称.key(model.getKey())// 继承模型标识(保证唯一性).addBpmnModel(model.getKey()+".bpmn20.xml",bpmnModel)// 生成BPMN文件.deploy();// 执行部署// 4. 更新模型与部署的关联关系model.setDeploymentId(deploy.getId());repositoryService.saveModel(model);// 仅需执行一次,更新act_re_model表returnAjaxResult.success("部署成功",deploy.getId());}catch(Exceptione){// 日志记录(建议替换为日志框架,如SLF4J)e.printStackTrace();returnAjaxResult.error("部署失败:"+e.getMessage());}}}

四、关键细节与避坑指南

1. 数据存储校验

部署完成后,可通过以下SQL查询验证数据是否正确写入:

  • 查看部署记录:SELECT * FROM act_re_deployment WHERE ID_ = '部署ID'
  • 查看流程定义:SELECT * FROM act_re_procdef WHERE DEPLOYMENT_ID_ = '部署ID'
  • 查看模型关联:SELECT ID_, NAME_, DEPLOYMENT_ID_ FROM act_re_model WHERE ID_ = '模型ID'

2. 常见异常处理

  • 模型内容为空:检查act_ge_bytearray表中是否存在该模型的编辑器内容,若不存在需重新设计流程;
  • BPMN格式不合法:通常是流程设计存在逻辑错误(如无开始/结束节点、网关未连接完整),需返回Modeler重新调整;
  • 模型标识重复:act_re_procdef表中KEY_ + VERSION_组合唯一,重复部署会自动升级版本号。

3. 性能与安全优化

  • 避免重复部署:可在部署前添加校验,若模型已关联部署ID且流程定义未修改,直接返回成功;
  • 日志规范:替换e.printStackTrace()为日志框架(如Logback),便于问题排查;
  • 权限控制:为部署接口添加权限校验(如@PreAuthorize),仅允许管理员或流程设计师执行部署操作。

五、总结

Activiti模型部署的核心是“格式转换+数据持久化”,通过BpmnJsonConverter完成JSON到BPMNModel的转换,再通过repositoryService的部署接口生成流程定义,最终实现模型与部署的关联。整个过程涉及act_re_modelact_re_deploymentact_re_procdefact_ge_bytearray四张核心表的联动,是工作流从设计到执行的关键一步。

掌握这一流程后,可进一步扩展功能,如部署状态查询、流程定义启停、版本管理等,构建完整的工作流生命周期管理体系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1125649.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

查询指定任务的办理时间轴

一、接口核心需求分析 你提供的这段代码是Activiti工作流中查询指定任务的办理时间轴接口,核心业务需求如下: 关联查询:根据传入的任务ID(taskId),先获取对应的流程实例ID(processInstanceId&am…

Matlab 基于蚁群算法优化高斯过程回归(ACO-GPR)的数据多变量回归预测+交叉验证 (多输入单输出)

目录 1、代码简介 2、代码运行结果展示 3、代码获取 1、代码简介 Matlab 基于蚁群算法优化高斯过程回归(ACO-GPR)的数据多变量回归预测交叉验证 (多输入单输出) 默认5折,折数可调!采用交叉验证一定程度上抑制了过拟合的发生! 1.程序已经…

通过`exclude`排除冲突的Security自动配置类,解决Activiti与若依权限体系的兼容性问题;

你提供的这段代码是若依(RuoYi)框架集成Activiti后的启动类核心配置,我会先解析这段配置的核心作用,再说明关键细节和扩展优化方向。 一、代码核心需求与作用解析 你编写的RuoYiApplication启动类通过SpringBootApplication的excl…

MYSQL 创建索引

目录 自动索引 手动创建 主键索引 唯一索引 普通索引 创建复合索引 查看索引 删除主键 自动索引 如果我们为一张表添加主键约束、外键约束、唯一约束时,MYSQL会为对应的列自动创建一个索引。如果不指定任何约束时,MYSQL会自动为每一列生成一个索…

Thinkphp和Laravel框架的流浪猫领养系统_ct8whxh8

目录 ThinkPHP与Laravel框架的流浪猫领养系统对比分析系统架构与开发效率功能模块设计数据库与性能优化安全性与社区支持部署与维护 项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理 ThinkPHP与Laravel框架的流浪猫领养系统对比分析 系统架构与开…

MySql 8.0安装教程(windows系统),全网最详细的教程

目录 前言安装步骤安装包下载 前言 MySQL数据库服务是一个完全托管的数据库服务,是目前比较流行的开源数据库来部署云原生应用程序,不管在企业开发,个人开发,学校做项目都是必备的一款工具,并且MySQL是开源的&#…

Tailwind CSS:告别传统CSS,拥抱原子化开发新时代

想象一下,你在开发一个项目时,不再需要为CSS命名而烦恼,不再需要频繁在HTML和CSS文件间切换,更不必担心样式冲突和重复代码——这一切都源于一个名为Tailwind CSS的工具类优先框架。 Tailwind CSS的核心理念是“功能类优先”&…

RK3576基于UVC协议USB摄像头配置指南,手把手教你搞定

瑞芯微RK3576芯片平台基于UVC协议,配置USB摄像头实现即插即用的适配采集功能。演示设备:触觉智能RK3576开发板Purple Pi OH2系统固件为:Buildroot2024其配套RK3576核心板,尺寸40.540.5mm,邮票孔封装,支持LP…

性能指标笔记

网络指标 TTFB Time to First Byte 衡量请求资源到响应第一个字节开始到达之间的时间,结合 网络 面吧的资源请求耗时,可以判断主要延迟在哪一层。 关于 Network 网络面板: Queued at:表示请求何时入队,如果是 HTTP/1…

Thinkphp和Laravel框架的海关出入口货物报关统筹管理系统_szdhjj06

目录摘要概述技术架构对比核心功能模块性能与安全优化实施效果与扩展性项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理摘要概述 ThinkPHP和Laravel框架在海关出入口货物报关统筹管理系统中的应用,展现了现代PHP框架在复杂业务场景下的…

ubuntu系统_每天定时23:00 定时关机_怎么实现

在Ubuntu系统中设置每天23:00定时关机,最可靠的方法是使用系统内置的 cron 服务。下面的表格汇总了实现步骤和关键要点,你可以快速了解整个过程。步骤核心操作说明/命令示例1. 编辑计划任务终端中输入 sudo crontab -e使用 sudo 获取root权限&#xff0c…

HTML 表单元素与 React 中的其他 DOM 元素有所不同

React 表单与事件 本章节我们将讨论如何在 React 中使用表单。 HTML 表单元素与 React 中的其他 DOM 元素有所不同,因为表单元素生来就保留一些内部状态。 在 HTML 当中&#xff0c;像 <input>, <textarea>, 和 <select> 这类表单元素会维持自身状态&…

2026年最好用的六大代理IP服务商推荐:IPIDEA、Decodo、Smartproxy、IPRoyal、SOAX、Oxylabs

一、IPIDEA&#xff1a;IPIDEA是一家面向企业级AI训练与数据采集场景的全球代理服务商&#xff0c;其技术架构以超1亿高质量代理IP组成的庞大资源池为核心&#xff0c;覆盖全球220多个国家和地区&#xff0c;提供动态/静态住宅代理、移动代理及数据中心代理等全类型服务。IPIDE…

indirectly_readable和indirectly_writable这两个核心概念的具体定义和使用场景是什么?

indirectly_readable 和 indirectly_writable 是 C20 中引入的两个核心概念&#xff0c;它们为迭代器操作提供了基础的类型安全约束&#xff0c;是理解现代 C 范围库和算法库的关键。 下面这个表格能帮你快速把握它们的核心区别&#xff1a;特性indirectly_readableindirectly_…

超绝好用清理软件工具,(附下载方式)超多好用功能

电脑用久了&#xff0c;难免会堆积闲置软件、捆绑程序&#xff0c;自带卸载工具往往 “卸不干净”&#xff0c;残留的文件碎片和注册表垃圾不仅占用磁盘空间&#xff0c;还可能拖慢系统运行。今天给大家实测推荐三款 Windows 平台口碑爆棚的卸载工具 ——HiBit Uninstaller、Ge…

数据库分片和分区

1.分片Database Sharding是一种 水平拆分&#xff08;Horizontal Partitioning&#xff0c;按行拆分&#xff09; 的方案&#xff0c;用来解决单机数据库在数据量、并发量上的瓶颈问题。&#xff08;垂直拆分是指按列的字段拆分。&#xff09;一句话定义&#xff1a;把同一张逻…

何为Transformer 架构?

何为Transformer 架构&#xff1f;最后 选择AI大模型就是选择未来&#xff01;最近两年&#xff0c;大家都可以看到AI的发展有多快&#xff0c;时代在瞬息万变&#xff0c;我们又为何不给自己多一个选择&#xff0c;多一个出路&#xff0c;多一个可能呢&#xff1f; 与其在传统…

HiBit Uninstaller全攻略:轻量无广,彻底告别软件残留(附下载方式)

一、软件简介&#xff1a;为何它能成为系统清理神器&#xff1f;HiBit Uninstaller是由HiBit Software开发的免费Windows系统卸载工具&#xff0c;自2017年发布以来&#xff0c;凭借轻量、高效、无广告的特性&#xff0c;在同类工具中脱颖而出&#xff0c;成为普通用户与IT维护…

电阻的基础知识

电阻与电容、电感一样都是最基本的元器件&#xff0c;大量使用于各种电气或电子设备中。对从事电气工作的人而言或许过于普通&#xff0c;平时忽视了它&#xff0c;但如果没有电阻&#xff0c;电气或电子电路就无法建立。电阻就是如此重要的元器件。 电阻的作用电阻是具有一定电…

jvm性能调优

JVM性能调优方法调整堆内存大小 -Xms和-Xmx参数分别设置JVM堆的初始大小和最大大小。建议将两者设为相同值以避免运行时动态调整带来的性能开销。例如&#xff1a; -Xms4g -Xmx4g 根据应用需求调整大小&#xff0c;避免频繁Full GC。选择合适的垃圾回收器 根据应用特点选择垃圾…