Solon v3.8.3

v3.8.1 solon-flow-workflow 更新与兼容说明

</> markdown
2026年1月13日 下午7:09:53

3.8.1 更新与兼容说明

  • 添加 solon-flow FlowContext:toJson,fromJson 序列化方法(方便持久化和恢复)
  • 添加 solon-flow NodeTrace 类
  • 添加 solon-flow NodeSpec.then 方法
  • 添加 solon-flow FlowEngine.then 方法
  • 添加 solon-flow FlowContext.with 方法(强调方法域内的变量)
  • 添加 solon-flow FlowContext.containsKey 方法
  • 添加 solon-flow FlowContext.isStopped 方法(用于外部检测)
  • 添加 solon-flow NamedTaskComponent 接口,方便智能体开发
  • 添加 solon-flow 多图多引擎状态记录与序列化支持
  • 添加 solon-flow-workflow findNextTasks 替代 getTasks(后者标为弃用)
  • 添加 solon-flow-workflow claimTask、findTask 替代 getTask(后者标为弃用,逻辑转为新的 claimTask)
  • 添加 solon-flow-workflow WorkflowIntent 替代之前的临时变量(扩展更方便)
  • 优化 solon-flow FlowContext 接口设计,并增加持久化辅助方法
  • 优化 solon-flow FlowContext.eventBus 内部实现改为字段模式
  • 优化 solon-flow start 类型节点改为自由流出像 activity 一样(只是没有任务)
  • 优化 solon-flow loop 类型节点改为自由流出像 activity 一样
  • 优化 solon-flow 引擎的 onNodeEnd 执行时机(改为任务执行之后,连接流出之前)
  • 优化 solon-flow 引擎的 onNodeStart 执行时机(改为任务执行之前,连接流入之后)
  • 优化 solon-flow 引擎的 reverting 处理(支持跨引擎多图场景)
  • 优化 solon-flow Node,Link toString 处理(加 whenComponent)
  • 优化 solon-flow FlowExchanger.runGraph 如果子图没有结束,则当前分支中断
  • 调整 solon-flow 移除 FlowContext:incrAdd,incrGet 弃用预览接口
  • 调整 solon-flow FlowContext:executor 转移到 FlowDriver
  • 调整 solon-flow FlowInterceptor:doIntercept 更名为 interceptFlow,并标为 default(扩展时语义清晰,且不需要强制实现)
  • 调整 solon-flow NodeTrace 更名为 NodeRecord,并增加 FlowTrace 类。支持跨图多引擎场景
  • 调整 solon-flow “执行深度”改为“执行步数”(更符合实际需求)
  • 调整 solon-flow-workflow Action Jump 规范,目标节点设为 WAITING(之前为 COMPLETED)
  • 调整 solon-flow-workflow getTask(由新名 claimTask 替代) 没有权限时返回 null(之前返回一个未知状态的任务,容易误解)
  • 调整 solon-flow-workflow WorkflowService 改为 WorkflowExecutor,缩小概念范围(前者仍可用但标为弃用)
  • 修复 solon-flow FlowContext 跨多引擎中转时 exchanger 的冲突问题
  • 修复 solon-flow 跨图单步执行时,步数传导会失效的问题
  • 修复 solon-flow ActorStateController 没有对应的元信息会失效的问题
  • 修复 solon-flow-workflow 跨图单步执行时,步数传导会失效的问题

兼容变化对照表:

旧名称新名称备注
WorkflowServiceWorkflowExecutor缩小概念范围(前者标为弃用)
FlowInterceptor:doInterceptinterceptFlow扩展时语义清晰(方便与 ToolInterceptor 合到一起)
FlowContext:executorFlowDriver:getExecutor上下文不适合配置线程池
FlowContext:incrAdd,incrGet/移除
NodeTraceNodeRecord支持跨图多引擎场景
/FlowTrace支持跨图多引擎场景

WorkflowExecutor (更清晰的)接口对照表:

WorkflowService 旧接口WorkflowExecutor 新接口备注
getTaskclaimTask认领任务:权限匹配 + 状态激活
getTaskfindTask查询任务:查找下一个待处理节点,或者结束节点
getTask/原来的功能混乱,新的拆解成 claimTask 和 findTask
getTasksfindNextTasks查询下一步任务列表
getStategetState获取状态
postTasksubmitTask提交任务

新特性预览:上下文序列化与持久化

//恢复的上下文
FlowContext context = FlowContext.fromJson(json);
//新上下文
FlowContext context = FlowContext.of();

//从恢复上下文开始持行
flowEngine.eval(graph, context);

//转为 json(方便持久化)
json = context.toJson();

新特性预览:WorkflowExecutor

// 1. 创建执行器
WorkflowExecutor workflow = WorkflowExecutor.of(engine, controller, repository);

// 2. 认领任务(检查是否有可操作的待处理任务)
Task current = workflow.claimTask(graph, context);
if (current != null) {
    // 3. 提交任务处理
    workflow.submitTask(current, TaskAction.FORWARD, context);
}

// 4. 查找后续可能任务(下一步)
Collection<Task> nextTasks = workflow.findNextTasks(graph, context);

3.8.0 更新与兼容说明

  • 新增 solon-flow-workflow 插件(替代 FlowStatefulService 接口)

兼容变化对照表:

旧名称新名称说明
GraphDeclGraphSpec图定义
LinkDeclLinkSpec连接定义
NodeDeclNodeSpec节点定义
ConditionConditionDesc条件描述
TaskTaskDesc任务描述(可避免与 workflow 的概念冲突)
FlowStatefulServiceWorkflowService工作流服务
StatefulTaskTask任务
OperationTaskAction任动工作
TaskTypeTaskState任务状态
Evaluation.runTest(..)Evaluation.runCondition(..)运行条件

FlowStatefulService 到 WorkflowService 的接口变化对照表:

旧名称新名称说明
postOperation(..)postTask(..)提交任务
postOperationIfWaiting(..)postTaskIfWaiting(..)提交任务
evel(..)/执行
stepForward(..)/单步前进
stepBack(..)/单步后退
/getState(..)获取状态

新特性预览:Graph 硬编码方式(及修改能力增强)

//硬编码
Graph graph = Graph.create("demo1", "示例", spec -> {
    spec.addStart("start").title("开始").linkAdd("01");
    spec.addActivity("n1").task("@AaMetaProcessCom").linkAdd("end");
    spec.addEnd("end").title("结束");
});

//修改
Graph graphNew = Graph.copy(graph, spec -> {
    spec.getNode("n1").linkRemove("end").linkAdd("n2"); //移掉 n1 连接;改为 n2 连接
    spec.addActivity("n2").linkAdd("end");
});

新特性预览:FlowContext:lastNodeId (计算的中断与恢复)。参考:https://solon.noear.org/article/1246

flowEngine.eval(graph, context.lastNodeId(), context);
//...(从上一个节点开始执行)
flowEngine.eval(graph, context.lastNodeId(), context);

新特性预览:WorkflowService(原名 FlowStatefulService)

WorkflowService workflow = WorkflowService.of(engine, WorkflowDriver.builder()
        .stateController(new ActorStateController()) 
        .stateRepository(new InMemoryStateRepository()) 
        .build());


//1. 取出任务
Task task = workflow.getTask(graph, context);

//2. 提交任务
workflow.postTask(task.getNode(), TaskAction.FORWARD, context);