RiverFlow 近期更新:循环节点组件与动态数据源驱动包管理

RiverFlow 近期更新:循环节点组件与动态数据源驱动包管理 RiverFlow 近期更新循环节点组件与动态数据源驱动包管理适用分支sxs-cremation运行环境JDK 8 Spring Boot 2.7.x本次更新了两个核心能力循环节点组件支持在流程中构建foreach遍历循环与while条件循环满足批量数据处理、A 库到 B 库迁移、分批调用接口等复杂场景。动态数据源驱动包上传支持 PostgreSQL、Oracle 等内置数据库同时允许用户上传自定义 JDBC 驱动 JAR 包解决非内置数据库或无默认驱动时的连接问题。同时所有代码已针对sxs-cremation的JDK 8 Spring Boot 2.x目标环境完成兼容性适配前端国际化相关改动已剥离保持中文原生体验。一、循环节点组件1.1 为什么需要循环节点在之前的流程设计中节点之间是“一次执行、顺序流转”的模型。面对以下场景时显得力不从心从 A 数据库查询出 1000 条记录逐条处理后写入 B 数据库调用上游接口返回一个集合需要对集合中每个元素再调用下游接口根据某个条件反复执行一段子流程直到条件不满足为止。循环节点通过引入“循环开始 → 循环体 → 循环结束”的局部作用域把上述场景封装成可配置、可监控、可并行的流程结构。1.2 新增节点类型节点类型说明foreach遍历循环开始基于集合或数组逐元素迭代end_foreach遍历循环结束负责汇聚迭代结果while条件循环开始基于 SpEL 表达式判断是否继续end_while条件循环结束汇总条件循环结果这些节点已在FlowNodeTypeEnum中注册并在流程设计器的左侧节点面板中可用。1.3 Foreach 遍历循环集合来源支持从上下文变量读取集合例如context.get(userList)。迭代变量每次迭代将当前元素放入指定变量循环体内节点可引用。执行模式支持串行与并行两种模式。串行一次只执行一个迭代结果可累加。并行多个迭代并发执行通过batchNo聚合结果。1.4 While 条件循环通过 SpEL 表达式定义循环条件例如#{counter 10}。每次迭代结束后重新求值避免旧版本中因缓存导致条件永远为true的 bug。支持在循环体内修改上下文变量作为下一次条件判断的依据。1.5 循环体与结果汇聚循环体内部是一个独立的子流程段LoopBodyEngine负责驱动循环体执行LoopAsyncCoordinator处理并行循环的异步协调与结果汇聚LoopState维护循环运行状态包括当前迭代下标、迭代结果、异常信息等EndForeachNodeExecutor/EndWhileNodeExecutor在循环结束时把多轮迭代结果写回主流程上下文。1.6 循环进度监控流程实例详情页新增“循环概览”标签页通过LoopProgressPanel组件实时展示各循环节点的迭代进度每个迭代的执行状态失败迭代的错误信息。任务列表也新增了loopNodeId、iterationIndex、isLoopInternal等字段方便追踪每个任务属于哪一轮循环。二、动态数据源驱动包管理2.1 功能背景原有动态数据源仅内置了 MySQL 驱动。实际项目中经常需要连接 Oracle、PostgreSQL、SQL Server、达梦等数据库。如果把这些驱动全部打包进项目会造成启动包体积膨胀驱动版本冲突商业驱动如 Oracle存在授权限制。本次更新采用“内置常用 自定义上传”的混合方案MySQL、Oracle、PostgreSQL 作为内置驱动直接可用其他数据库由管理员按需上传驱动 JAR 包。2.2 内置数据库类型DbTypeEnum现在支持MySQLOraclePostgreSQLSQL Server达梦DM其他Other选择内置类型时驱动类会自动填充无需手动输入。2.3 自定义驱动上传在“数据源管理”页面中数据库类型选择“其他”手动填写驱动类名上传对应数据库的 JDBC 驱动 JAR 包系统会把 JAR 保存到配置目录默认${user.home}/riverflow/drivers。上传接口POST /datasource/uploadDriverJar对应前端api/datasource.js中的uploadDriverJar方法。2.4 类隔离与缓存JdbcDriverJarLoader为每个数据源维护独立的URLClassLoader不同数据源可以使用不同版本的驱动互不干扰驱动 JAR 路径和 ClassLoader 都缓存在内存中避免重复加载数据源更新或删除时旧的 ClassLoader 会被清理释放资源。2.5 配置项在application.yml中新增riverflow:datasource:driver:# 自定义 JDBC 驱动 JAR 包存储目录dir:${user.home}/riverflow/drivers# 单个驱动 JAR 最大 50MBmax-file-size:52428800三、Spring Boot 2.x / JDK 8 兼容性适配由于boot-3.0分支基于 Spring Boot 3.x JDK 21 开发而sxs-cremation目标是 Spring Boot 2.7.x JDK 8迁移过程中做了以下兼容性调整项目boot-3.0 写法sxs-cremation 写法Servlet APIjakarta.servlet.*javax.servlet.*PostConstructjakarta.annotation.PostConstructjavax.annotation.PostConstructSpring Security 方法注解EnableMethodSecurityEnableGlobalMethodSecuritySpring Security 路径匹配requestMatchers()/authorizeHttpRequests()antMatchers()/authorizeRequests()Stream 收集Stream.toList()Collectors.toList()MyBatis Plus Startermybatis-plus-spring-boot3-startermybatis-plus-boot-starter同时保留了原有 SQL Server 与达梦数据库支持没有因为新增“其他”类型而删除旧类型。四、数据库升级说明如果已有数据库环境需要执行以下ALTER TABLE语句-- 动态数据源新增驱动 JAR 包路径字段ALTERTABLEwf_datasourceADDCOLUMNIFNOTEXISTSdriver_jar_pathVARCHAR(500)NULLCOMMENT驱动JAR包路径自定义驱动时使用AFTERdriver_class;-- wf_flow_task 增加循环节点相关字段ALTERTABLEwf_flow_taskADDCOLUMNIFNOTEXISTSloop_node_idvarchar(50)NULLDEFAULTNULLCOMMENT所属循环节点IDAFTERnode_name,ADDCOLUMNIFNOTEXISTSiteration_indexint(11)NULLDEFAULTNULLCOMMENT循环迭代下标AFTERloop_node_id,ADDCOLUMNIFNOTEXISTSis_loop_internaltinyint(4)NULLDEFAULT0COMMENT是否循环体内部任务0-否 1-是AFTERiteration_index,ADDCOLUMNIFNOTEXISTStask_typevarchar(30)NULLDEFAULTNODECOMMENT任务类型NODE/LOOP_ITERATION/LOOP_AGGREGATEAFTERis_loop_internal,ADDCOLUMNIFNOTEXISTSbatch_novarchar(64)NULLDEFAULTNULLCOMMENT并行循环批次号AFTERtask_type;-- wf_flow_edge 增加隐藏边字段ALTERTABLEwf_flow_edgeADDCOLUMNIFNOTEXISTSis_hiddentinyint(4)NULLDEFAULT0COMMENT画布上是否隐藏如循环回跳边0-显示 1-隐藏AFTERpriority;五、典型应用场景场景 1A 库到 B 库的数据迁移使用db节点从 A 库查询数据集合foreach循环遍历集合循环体内用script节点重新组装数据再用db节点写入 B 库循环结束后通过end_foreach汇总写入记录数。场景 2分批调用外部接口上游接口返回待处理列表foreach设置为并行模式循环体内调用下游api节点通过循环进度面板监控每一批次的执行状态。场景 3连接 Oracle/PostgreSQL数据源类型选择 Oracle 或 PostgreSQL直接连接若需连接其他未内置数据库选择“其他”类型上传驱动 JAR填写驱动类名即可。六、结语本次更新在不升级底层框架保持 JDK 8 Spring Boot 2.x的前提下为 RiverFlow 引入了两大核心增强循环节点组件让流程具备了处理批量、迭代、条件重复执行的能力动态数据源驱动包管理让系统能够灵活接入更多类型的数据库。后续可根据实际使用情况继续完善循环节点的可视化配置、错误重试策略以及更多数据库类型的内置驱动支持。