当前位置: 首页 > article >正文

Flowable BPMN扩展实战:从自定义属性定义到运行时动态解析

1. 为什么需要自定义BPMN属性在真实业务场景中标准BPMN规范提供的属性往往无法满足复杂流程需求。比如我们团队最近遇到的几个典型case会签场景需要标记最少通过人数动态指派任务时需要携带候选人角色白名单紧急审批流程要控制超时自动通过阈值这些业务规则如果硬编码在Java委托类里每次修改都要重新部署流程。而通过自定义属性可以直接在流程设计器可视化配置真正实现业务规则与流程引擎解耦。实测下来这种方案比传统开发方式节省了60%以上的流程迭代时间。2. 属性定义从元数据到可视化配置2.1 解剖stencilset_bpmn.json这个配置文件相当于Flowable设计器的属性字典。我习惯用VS Code打开它因为JSON结构清晰可见。关键在propertyPackages这个数组每个元素代表一组属性集合。举个例子{ name: approval_rules_package, properties: [ { id: minApprovers, type: Integer, title: 最少审批人数, defaultValue: 1, description: 会签场景下需要的最小同意人数 }, { id: allowEmergencyPass, type: Boolean, title: 允许紧急跳过, value: false } ] }踩坑提醒type字段支持的类型有限我实测可用类型包括String默认BooleanIntegerFloatDateEnum需要额外配置enumValues2.2 绑定到具体节点定义好的属性包需要关联到BPMN元素。在UserTask的配置块里添加引用{ type: node, id: UserTask, propertyPackages: [ approval_rules_package, another_package ] }有个小技巧属性显示顺序取决于它们在数组中的位置。我通常把高频属性放在前面方便业务人员配置。3. 属性持久化让配置真正生效3.1 自定义JsonConverter实战这里有个大坑设计器里配的属性默认不会保存到BPMN XML必须通过扩展UserTaskJsonConverter实现双向转换。分享我的模板代码public class CustomTaskConverter extends UserTaskJsonConverter { Override protected FlowElement convertJsonToElement(JsonNode elementNode, JsonNode modelNode, MapString, JsonNode shapeMap) { UserTask task (UserTask) super.convertJsonToElement(elementNode, modelNode, shapeMap); // 处理数字类型属性 Integer minApprovers getPropertyValueAsInteger(minApprovers, elementNode); if (minApprovers ! null) { task.addCustomProperty(createProperty(minApprovers, minApprovers.toString())); } // 处理布尔类型属性 Boolean allowEmergency getPropertyValueAsBoolean(allowEmergencyPass, elementNode); if (allowEmergency ! null) { task.addCustomProperty(createProperty(allowEmergencyPass, allowEmergency.toString())); } return task; } private CustomProperty createProperty(String name, String value) { CustomProperty prop new CustomProperty(); prop.setId(name); prop.setName(name); prop.setSimpleValue(value); return prop; } }3.2 注册自定义转换器在Spring配置类中添加初始化逻辑Bean public BpmnJsonConverterConfigurer customConverterConfigurer() { return converter - { converter.getConvertersToBpmnMap().put(UserTask, CustomTaskConverter.class); converter.getConvertersToJsonMap().put(UserTask.class, CustomTaskConverter.class); }; }部署后查看生成的BPMN XML应该能看到类似这样的扩展属性userTask idtask1 name主管审批 extensionElements flowable:minApprovers3/flowable:minApprovers flowable:allowEmergencyPasstrue/flowable:allowEmergencyPass /extensionElements /userTask4. 运行时动态解析属性4.1 从流程定义获取属性在任务监听器或Java委托中我常用这套组合拳获取属性public class ApprovalRulesDelegate implements JavaDelegate { Override public void execute(DelegateExecution execution) { BpmnModel model repositoryService.getBpmnModel(execution.getProcessDefinitionId()); FlowElement element model.getFlowElement(execution.getCurrentActivityId()); if (element instanceof UserTask) { UserTask task (UserTask) element; // 获取数字类型属性 Integer minApprovers getExtensionProperty(task, minApprovers, Integer.class); // 获取布尔类型属性 Boolean allowEmergency getExtensionProperty(task, allowEmergencyPass, Boolean.class); // 业务逻辑处理... } } private T T getExtensionProperty(UserTask task, String name, ClassT type) { ListExtensionElement elements task.getExtensionElements() .getOrDefault(name, Collections.emptyList()); if (!elements.isEmpty()) { String value elements.get(0).getElementText(); if (type Integer.class) return (T) Integer.valueOf(value); if (type Boolean.class) return (T) Boolean.valueOf(value); return (T) value; } return null; } }4.2 动态覆盖属性值更高级的玩法是在运行时修改属性。比如根据业务数据动态调整审批人数// 在流程启动时动态注入 ProcessInstance instance runtimeService.startProcessInstanceByKey( approvalProcess, variables, Collections.singletonMap(minApprovers, 5) // 覆盖设计器配置 );5. 生产环境最佳实践5.1 性能优化方案在大规模流程应用中频繁解析BPMN模型会成为性能瓶颈。我的解决方案是属性缓存Cacheable(cacheNames flowableProperties, key #processDefinitionId : #activityId) public MapString, Object getTaskProperties(String processDefinitionId, String activityId) { // 解析逻辑... }配合Spring Cache使用TPS提升超过70%。缓存失效策略建议流程定义变更时清空相关缓存设置合理的TTL如30分钟5.2 错误处理经验这些坑我亲自踩过类型转换异常XML里的true转Boolean时要做trim()空指针防护getExtensionElements()可能返回null版本兼容升级Flowable版本时要测试属性解析逻辑建议在工具类中封装安全的获取方法public static OptionalString getSafeExtensionValue(UserTask task, String key) { return Optional.ofNullable(task.getExtensionElements()) .map(ext - ext.get(key)) .filter(list - !list.isEmpty()) .map(list - list.get(0).getElementText()); }6. 扩展应用场景6.1 动态任务指派结合自定义属性实现灵活的任务分配userTask idtask1 flowable:candidateUsers${approvers} extensionElements flowable:approverRulesDEPARTMENT_LEADER,PROJECT_MANAGER/flowable:approverRules /extensionElements /userTask在监听器中动态解析String rules getExtensionProperty(task, approverRules, String.class); ListString candidates roleService.findUsersByRoles(rules.split(,)); taskService.setAssignee(taskId, candidates.get(0));6.2 条件路由增强扩展的网关条件表达式sequenceFlow idflow1 sourceRefgateway1 targetReftask1 extensionElements flowable:advancedCondition${amount 10000 urgency HIGH}/flowable:advancedCondition /extensionElements /sequenceFlow在自定义的条件评估器中解析String condition getExtensionProperty(flow, advancedCondition, String.class); Expression expression expressionManager.createExpression(condition); return (Boolean) expression.getValue(variables);

相关文章:

Flowable BPMN扩展实战:从自定义属性定义到运行时动态解析

1. 为什么需要自定义BPMN属性? 在真实业务场景中,标准BPMN规范提供的属性往往无法满足复杂流程需求。比如我们团队最近遇到的几个典型case: 会签场景需要标记"最少通过人数"动态指派任务时需要携带"候选人角色白名单"紧急…...

【互联网大厂Java面试】核心技术栈面试问答实战解析

互联网大厂Java求职面试实战问答 本文以互联网大厂Java求职者面试为场景,围绕核心技术栈,采用故事化形式,严肃的面试官与搞笑的水货程序员谢飞机进行问答。文章分3轮,每轮包含3-5个问题,问题循序渐进,旨在…...

保姆级教程:在Linux服务器上用源码搞定Datavines 1.0.0的安装与启动

保姆级教程:在Linux服务器上用源码搞定Datavines 1.0.0的安装与启动 1. 环境准备与依赖检查 在开始部署Datavines之前,确保你的Linux服务器满足以下基础要求。这个环节经常被忽视,但却是后续所有操作的前提条件。 操作系统要求: 推…...

GIL已死,但并发更难?——Python无锁环境下的竞态漏洞高发清单(附12个生产级检测脚本)

第一章:GIL消亡后的Python并发新纪元随着CPython 3.13正式移除全局解释器锁(GIL)的实验性支持,以及3.14中GIL的彻底移除,Python终于迈入真正的原生多核并发时代。这一变革并非简单地“去掉一把锁”,而是重构…...

LeetCode刷题保姆级攻略:用滑动窗口秒杀「无重复字符的最长子串」和「最小覆盖子串」

LeetCode滑动窗口算法精讲:从暴力解法到最优解的思维跃迁 滑动窗口算法是解决字符串和数组子序列问题的利器,尤其适合处理"最长子串"、"最小覆盖子串"这类经典问题。很多开发者在初次接触这类题目时,往往会陷入暴力解法…...

SEO研究是否需要进行A-B测试

SEO研究是否需要进行A/B测试 在当今竞争激烈的数字市场中,搜索引擎优化(SEO)已经成为企业提升网站流量和品牌知名度的重要手段。随着SEO领域的不断发展,许多企业开始质疑:是否需要在SEO研究中进行A/B测试。本文将深入…...

超越目标空间:多模态多目标优化算法的决策空间评价指标深度解析

1. 为什么我们需要关注决策空间的评价指标? 在传统的多目标优化问题中,我们通常只关注目标空间的性能表现。比如常见的IGD(反转世代距离)和HV(超体积)指标,它们能够很好地衡量解集在目标空间的分…...

Neovim文本编辑器

链接:https://pan.quark.cn/s/ce457be69098Neovim是一款基于Vi编辑器的文本编辑器,Neovim是Vim的一个分支,旨在解决Vim的一些缺点并提供额外特性。Neovim具有更好的性能和稳定性,支持异步插件和脚本,改进了对现代用户界…...

多模态扩展:OpenClaw对接Qwen3-14B镜像实现图文混合处理

多模态扩展:OpenClaw对接Qwen3-14B镜像实现图文混合处理 1. 为什么需要多模态能力扩展 去年我在整理技术文档时,发现纯文本处理已经无法满足实际需求。当需要从截图提取错误日志、给产品原型图生成说明文档时,不得不反复在多个工具间切换。…...

别让Liquid Glass拖慢你的App!给uni-app开发者的iOS 26动画优化清单(含代码示例)

别让Liquid Glass拖慢你的App!给uni-app开发者的iOS 26动画优化清单(含代码示例) 最近在开发者社区里,不少同行都在吐槽iOS 26的动画性能问题。特别是那些采用了新Liquid Glass设计的应用,在旧款iPhone上运行时&#x…...

NAT地址映射表详解:如何看懂并优化你的网络转换效率

NAT地址映射表深度解析:从原理到实战优化的完整指南 当你打开手机浏览网页时,是否想过内网设备如何通过有限的公网IP与全球互联网通信?这背后隐藏着一项关键技术——NAT地址转换。不同于教科书式的概念罗列,我们将从真实网络工程师…...

HTML函数在ARM架构设备能运行吗_ARM硬件兼容性测试【详解】

HTML 本身没有函数,它不是编程语言;真正运行在 ARM 设备上的是 JavaScript、后端代码或 WebAssembly,主流浏览器和 Node.js 均原生支持 ARM 架构,问题多出在依赖的二进制模块或 wasm 文件架构不匹配。HTML函数?浏览器里…...

MGC3130电场式三维手势控制器原理与工程实践

1. MGC3130:全球首款电场式三维手势与轨迹追踪控制器深度解析1.1 技术定位与工程价值MGC3130 是由Microchip(原Atmel)推出的全球首款基于电场(E-field)传感原理的三维空间轨迹追踪与手势识别专用控制器。其核心突破在于…...

Flutter鸿蒙应用开发:数据分享功能实现

🔥Flutter鸿蒙应用开发:数据分享功能实现(macOSDevEco Studio) 欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net 📄 文章摘要 本文为Flutter for OpenHarmony跨平台应用开发系列实…...

OpenClaw问题排查大全:百川2-13B-4bits量化模型接入常见错误

OpenClaw问题排查大全:百川2-13B-4bits量化模型接入常见错误 1. 问题排查前的准备工作 在开始排查OpenClaw与百川2-13B-4bits量化模型对接的问题前,我们需要先确认几个基础环境要素。这些准备工作往往能帮我们快速排除50%以上的低级错误。 首先检查Op…...

2025届学术党必备的六大降重复率助手推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 提高人工智能生成内容即AIGC的检测难度,关键之处在于增强文本的自然特性与个性化…...

如何比较不同注册商的域名注册价格_如何查看域名的SEO数据和排名信息

如何比较不同注册商的域名注册价格 在互联网时代,域名已经成为网站的“门面”,是网站建设的重要一步。不同注册商的域名注册价格差异较大,如何在保证性价比的前提下选择合适的注册商成为了一个重要的问题。本文将详细探讨如何比较不同注册商…...

OpenClaw多模态研究助手:千问3.5-35B-A3B-FP8实现论文图表解析与笔记生成

OpenClaw多模态研究助手:千问3.5-35B-A3B-FP8实现论文图表解析与笔记生成 1. 为什么需要多模态研究助手 作为一名经常需要阅读前沿论文的研究者,我长期被两个问题困扰:一是PDF论文中的图表数据提取费时费力,二是阅读过程中的碎片…...

腾讯云ICP备案:变更主体备案准备

腾讯云ICP备案:变更主体&备案准备一、变更主体适用场景已经成功办理备案的网站/APP,支持备案主体信息的变更申请。当备案主体信息发生变化时,建议及时办理备案变更,避免影响业务运行,可直接通过腾讯云备案控制台办…...

6款AI论文改写工具,智能降重与语言润色,有效减少重复率。

开头总结工具对比(技能4) �� 为帮助学生们快速选出最适合的AI论文工具,我从处理速度、降重效果和核心优势三个维度,对比了6款热门网站,数据基于实际使用案例: 工具名称 处理速度 降…...

6款AI论文降重软件,智能改写与优化,显著提升原创度。

开头总结工具对比(技能4) �� 为帮助学生们快速选出最适合的AI论文工具,我从处理速度、降重效果和核心优势三个维度,对比了6款热门网站,数据基于实际使用案例: 工具名称 处理速度 降…...

IIS配置HTTPS如何多个二级域名连接!

一、前言 我们可能多个域名指向同一个主机,但我们配置HTTPS之后,发现仅配置的一个域名可用; 我们仅申请了一个二级域名的证书,如:www.xxx.com;(个人免费证书) 我的另外一个二级域名&#xff…...

OpenClaw安全实践:Phi-3-mini-128k-instruct本地化部署的3个关键配置

OpenClaw安全实践:Phi-3-mini-128k-instruct本地化部署的3个关键配置 1. 为什么需要关注OpenClaw的安全配置? 去年夏天,我在整理个人财务数据时突发奇想:能否用AI自动生成月度支出分析报告?这个看似简单的需求&#…...

C++27反射工具链现状全景图(2024Q3):Boost.PFR停更、cpp-reflect弃坑、std::reflect成为唯一工业级选择?

第一章:C27静态反射的标准化演进与战略意义C27静态反射(Static Reflection)正从实验性提案走向核心语言特性,其标准化进程标志着C元编程范式的根本性跃迁。不同于C20的std::is_same_v等类型特征或C23的std::type_identity_t&#…...

GLM-OCR硬件优化指南:为GPU部署调整显存与算力配置

GLM-OCR硬件优化指南:为GPU部署调整显存与算力配置 如果你正在尝试部署GLM-OCR模型,是不是也遇到过这样的困惑:明明选了看起来不错的GPU,但推理时要么爆显存,要么速度慢得让人着急,钱花了效果却没达到预期…...

开发者效率提升:OpenClaw+Phi-3-vision-128k-instruct自动生成代码注释与文档

开发者效率提升:OpenClawPhi-3-vision-128k-instruct自动生成代码注释与文档 1. 为什么需要自动化代码文档维护 作为一个长期与代码打交道的开发者,我发现自己总在重复做一件"重要但不紧急"的事——写注释和更新文档。每次写完核心逻辑后&am…...

Linux CFS 的调度周期调整:任务数量对调度粒度的影响

一、简介1.1 背景与重要性在实时嵌入式系统、高性能计算(HPC)和云计算基础设施中,Linux 完全公平调度器(Completely Fair Scheduler, CFS)是默认的进程调度算法。CFS 自 Linux 2.6.23 版本引入以来,一直是 …...

32-字体反爬

本文需要借助工具:fontcreator,或者在线网站:字体设计在线网站 字体反爬介绍 字体反爬是网站常用的前端反爬手段,核心逻辑是用自定义字体文件替代明文文本,爬虫自动化也无法拿到正确的明文数据 字体反爬原理 本文主…...

无障碍技术实践:OpenClaw+Phi-3-vision-128k-instruct为视障用户描述图片

无障碍技术实践:OpenClawPhi-3-vision-128k-instruct为视障用户描述图片 1. 项目背景与动机 去年冬天的一次地铁站经历让我萌生了这个想法。当时我看到一位视障朋友在站台反复用盲杖试探前方障碍物,而墙上明明贴着"施工绕行"的警示海报。这个…...

三种常见AC/DC转换方案详解与选型指南

1. 交流转直流方案概述在电子设备设计中,将交流电转换为直流电是最基础也是最重要的环节之一。作为一名硬件工程师,我在过去十年里接触过各种AC/DC转换方案,从简单的阻容降压到复杂的开关电源设计。这些方案各有特点,适用于不同的…...