尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

蓝凌EKP18产品:扩展机制

蓝凌EKP18产品:扩展机制 任何一套流程引擎无论内置功能多丰富都不可能覆盖所有企业的所有场景。蓝凌的流程引擎真正优秀的地方就是让你对你的业务任性扩展却不要动核心代码。前面我们反复提到扩展点监听器自定义策略这些词。这一课把它们系统地串起来回答一个核心问题如果内置功能不够用我应该在哪里、用什么方式扩展蓝凌的流程引擎给了四把扩展钥匙自定义节点、事件监听器、自定义操作、流程变量。逐一拆解。一、扩展机制全景先看一张全景图理解扩展的四个维度流程引擎扩展维度 │ ├── 扩展流程元素加新节点类型 │ → 实现 ActivityBehaviour 接口 │ → 注册到类型管理器 │ → 流程设计器里就能拖出新节点 │ ├── 扩展流程行为在关键节点插入逻辑 │ → 实现 IEventListener 接口 │ → 注册到事件扩展点 │ → 事件触发时自动执行你的逻辑 │ ├── 扩展操作动作加新审批按钮 │ → 实现 IOperationBehaviour IOperationBinder │ → 绑定到节点类型 │ → 审批页出现新按钮 │ └── 扩展流程数据传递业务变量 → 使用 ProcessParameters 流程参数 → 三个层级实例 / 节点 / 工作项 → 在条件、公式、监听器里读写核心原则所有扩展都通过接口契约不修改引擎核心。这是第7课讲的依赖倒置和开闭原则在实战中的落地。二、扩展钥匙一自定义节点类型2.1 节点的行为是一个接口回顾第8课PVM 执行节点时调用的其实是一个ActivityBehaviour接口public interface ActivityBehaviour { /** 执行相应的操作 */ void execute(TaskExecution execution) throws Exception; }引擎不关心这个节点是审批、发邮件、还是调用外部接口——它只调用execute()方法。节点类型的差异全部封装在ActivityBehaviour的不同实现里。2.2 自定义节点的三步要新增一种节点类型比如WebService调用节点第一步实现 ActivityBehaviour class WebServiceNodeBehaviour implements ActivityBehaviour { execute() { // 1. 从流程参数取接口地址 // 2. 调用外部接口 // 3. 把结果写回流程参数 // 4. 结束当前节点流转到下一节点 } } ​ 第二步注册到类型管理器 NodeTypeManager 里 addType(新的节点类型) ​ 第三步设计器里配置 拖出新节点 → 配接口地址 → 配处理逻辑关键认知新增节点类型引擎核心PVM、原子操作、状态机一行代码都不用改。因为引擎只认ActivityBehaviour接口不认具体节点。三、扩展钥匙二事件监听器3.1 最常用的扩展方式事件监听器是 EKP 扩展体系里使用频率最高的。它的原理很简单流程执行到关键节点启动、进入节点、离开节点、结束、出错…时会发布事件。你写一个监听器注册到事件上就能在这些时刻插入自己的逻辑。3.2 IEventListener 接口public interface IEventListener { /** * 当事件发生时处理动作。 * param execution 事件上下文 * param parameter 前端配置信息强制执行的监听器则为 null */ void handleEvent(EventExecutionContext execution, String parameter) throws Exception; }接口极其简单——就一个handleEvent方法。但通过EventExecutionContext你能拿到几乎一切当前流程实例、当前节点、当前工作项流程参数、执行路径状态事件本身是什么事件触发的3.3 监听器的注册方式监听器通过扩展点注册而不是硬编码。注释里写得很清楚使用扩展点id:com.landray.kmss.lbpm.engine.event, item:listener注册的侦听器。这意味着监听器的注册是声明式的——在配置文件里声明监听什么事件、用哪个监听器类而不是在代码里写死。3.4 典型应用场景场景监听的事件监听器做的事审批通过后发企业微信操作执行事件组装消息 → 推送流程结束时更新关联文档流程结束事件改文档状态驳回时清理临时数据驳回操作事件删临时变量进入节点时校验权限节点进入事件校验 → 拦下或放行出错时通知管理员错误事件发告警这些场景有一个共同点都是横切关注点不属于流程主线的核心逻辑。用监听器挂上去主线保持干净。四、扩展钥匙三自定义操作4.1 什么是操作在第8课我们学过审批页上的通过驳回转办加签按钮背后都是操作Operation。每个操作由两部分组成操作 操作行为IOperationBehaviour 操作绑定IOperationBinder │ │ │ └── 决定什么节点显示这个按钮 └── 决定按钮点了之后干什么4.2 自定义操作的两步以加一个提交到总部按钮为例第一步实现 IOperationBehaviour class SubmitToHQBehaviour extends AbstractManualOperationBehaviour { prepareExecute() → 保存审批意见返回目标状态 execute() → 修改任务状态指定流转到总部节点 } ​ 第二步实现 IOperationBinder class SubmitToHQBinder implements IOperationBinder { bindNode() → 哪些节点类型显示这个按钮 bindTask() → 哪些工作项类型显示这个按钮 }4.3 操作与节点的解耦注意IOperationBinder的作用操作和节点是解耦的。操作逻辑Behaviour不关心自己在哪个节点出现绑定关系Binder单独定义。这意味着同一个提交到总部操作可以绑定到多个节点类型同一个节点也可以有多个操作按钮。操作是可复用的绑定是可配置的。五、扩展钥匙四流程变量5.1 什么是流程变量流程变量ProcessParameters是流程执行过程中贯穿始终的数据。它像流程的全局内存条件判断、公式计算、监听器逻辑、节点行为都能读写它。5.2 三个层级的作用域流程变量不是扁平的它有三个层级流程变量层级 ├── 流程实例级整个流程共享 │ 存流程的发起人、总金额、合同号 │ ├── 节点级某个节点实例独享 │ 存该节点的审批人列表、节点进入时间 │ └── 工作项级某个具体待办独享 存该待办的处理人、审批意见、加签信息三个层级对应三个生命周期流程结束才销毁 / 节点结束才销毁 / 工作项完成就销毁。5.3 流程变量的 APIProcessParameters提供了完整的读写接口操作实例级节点级工作项级读单个值getInstanceParamValuegetNodeParamValuegetInstanceParamValue读多个值getInstanceParamValuesgetNodeParamValuesgetInstanceParamValues写值setInstanceParamValuesetNodeParamValuesetInstanceParamValue追加值addInstanceParamValueaddNodeParamValueaddInstanceParamValue删值removeInstanceParamremoveNodeParamremoveInstanceParam5.4 流程变量的典型用途流程变量是条件连线和公式决策的数据基础。回顾第11课的差旅报销流程条件连线金额 50000 ↑ 这里的金额就是流程变量 —— 提交报销单时写入实例级变量amount —— 条件连线判断时读取amount没有流程变量条件连线就是无源之水。流程变量是流程配置和流程执行之间的数据桥梁。六、四把钥匙的适用场景对照扩展方式改什么典型场景难度自定义节点加新节点类型调用外部接口、复杂计算高事件监听器插入横切逻辑发通知、更新关联数据低自定义操作加新审批按钮提交总部、转办指定人中流程变量传递业务数据条件判断、公式计算低选择原则只是在某个时刻做点额外的事 → 用事件监听器要加一种全新的节点 → 用自定义节点要加一种新的审批动作 → 用自定义操作要让条件/公式能读到业务数据 → 用流程变量七、扩展的安全边界扩展机制给力但也意味着风险。EKP 的扩展体系有几条隐形的安全边界7.1 接口契约不可破坏所有扩展都基于接口。你可以实现接口但不能修改接口。这保证了引擎核心的稳定性——无论你写多少监听器、加多少节点PVM 的执行逻辑不变。7.2 监听器的异常要可控监听器抛异常不能把整个流程拖垮。回顾第8课事件执行有异常处理机制ErrorEvent。监听器的异常会被捕获、记录而不是让流程直接崩溃。7.3 流程变量的生命周期要清楚流程变量存多了会占用存储删错了会影响流程。所以要清楚每个变量的作用域和生命周期——实例级的别写到节点级节点级的别让它活到流程结束。八、一个完整扩展案例用一个案例串联四种扩展方式需求在差旅报销流程中增加一个外部审计节点。流程走到这个节点时自动调用审计系统的接口校验发票真伪校验不通过则退回起草人。8.1 扩展设计[部门经理审批] │ ▼ [外部审计节点] ← 自定义节点ActivityBehaviour │ execute() 里 │ 1. 读流程变量发票号 │ 2. 调审计接口 │ 3. 结果写回流程变量审计结果 │ ├─[条件连线审计结果通过] → 财务审批 └─[条件连线审计结果不通过] → 退回起草人8.2 涉及的扩展扩展点用途自定义节点实现ActivityBehaviour做接口调用流程变量存发票号实例级、审计结果节点级事件监听器审计不通过时监听退回事件发通知给起草人条件连线根据审计结果变量分流四种扩展协同工作实现了一个引擎原本不支持的功能——而且引擎核心零改动。九、业务价值9.1、需求响应从改核心变成插插件没有扩展机制客户说审批通过后要调我们公司的风控接口就得改引擎核心代码。改了核心升级标准版本时冲突、风险全来了。有了扩展机制实现一个 ActivityBehaviour 或写个监听器就搞定核心代码零改动。 标准产品升级不受影响二开代码独立维护。这是企业级软件的命脉——能不能让客户定制又不破坏产品。9.2、监听器 零成本满足顺带做点事的需求企业里大量需求是顺带的审批通过发个通知、流程结束更新个状态、驳回时清个缓存。这些不是核心流转逻辑但每个都要做。事件监听器让这些需求变成写一个小类 注册一下。 不用动流程定义、不用改节点、不用碰引擎。开发成本从天降到小时。9.3、自定义操作 快速响应新审批动作我们不要驳回要退回指定人重新填、加个提交总部按钮——审批动作千奇百怪。自定义操作IOperationBehaviour IOperationBinder让新按钮像积木一样插进去。 操作逻辑和节点绑定分离同一个按钮能复用新按钮能快速上。不用为每种动作改引擎。9.4、流程变量让流程会算数没有流程变量流程就是死板的从A到B。有了流程变量流程能根据金额、部门、时间动态决策——这就是第11课条件连线的数据基础。业务价值一套流程能表达复杂业务规则金额分层、组织判断、条件路由而不是为每种情况画一套流程。9.5、不改核心 升级成本趋近于零所有扩展都通过接口契约不碰引擎核心。这意味着- 标准产品升级客户二开代码不动平滑升级- 多人并行开发A 写监听器、B 写节点互不干扰- 回滚简单出问题删掉扩展类即可核心无感一句话扩展机制把客户定制从高风险改核心变成低风险插插件。 这是流程引擎能规模化交付、支持海量客户差异化的根本原因——产品负责稳定扩展负责灵活。
返回列表