Solon v3.5.0

statefulflow - 状态服务相关接口

</> markdown

(v3.4.0 后支持)状态服务(FlowStatefulService),是在 FlowEngine 基础上增加状态支持的增强接口。可直接用于:单步操控场景(比如调试),等待介入场景(比如行政审批)。

状态服务相关的主要接口包括:

主要接口描述
FlowStatefulService状态服务
StatefulSupporter有状态的支持接口(StatefulFlowContext 实现了此接口)
StatefulFlowContext有状态的流上下文(通过 FlowContext.of("i-1", stateController, stateRepository) 构建)
StateController状态控制器接口。提供状态控制(是否可操作,是否自动前进)
StateRepository状态仓库接口。提供状态保存与获取
StateType状态类型
Operation操作

StateController 框架内提供有(也可按需定制):

实现描述
BlockStateController阻塞状态控制器(所有节点有权操作,类似超级管理员)
NotBlockStateController不阻塞状态控制器(像无状态一样执行,除非中断,中断处可重复执行)。v3.5.0 后支持
ActorStateController参与者状态控制器(节点元数据匹配参与者后有权操作,没有配置的会自动前进)

StateRepository 框架内提供有(也可按需定制):

实现描述
InMemoryStateRepository内存状态仓库(基于 Map 封装)
RedisStateRepositoryRedis 状态仓库(基于 Redis 封装)

1、有状态与无状态的识别

是否需要状态处理,通过 FlowContext 是否有实例id进行识别

FlowContext.of(); //没有实例id,按无状态处理

FlowContext.of("1", stateController, stateRepository); //有实例id,按需要状态处理

2、FlowStatefulService 的获取

状态服务需要 StatefulFlowDriver 驱动接口的支持。所以主要是 StatefulSimpleFlowDriver 的构建。按需选择(或定制)合适的 stateController 和 stateRepository。构建的 FlowEngine 可以替换掉默认的驱动器,然后通过 flowEngine 获取 FlowStatefulService 接口。

@Configuration
public class DemoCom {
    @Bean
    public void demo(FlowEngine flowEngine) {
        //状态服务
        flowEngine.statefulService();
    }
}

FlowStatefulService 一组用于“断点操控”场景的接口:

接口描述
stepForward(...)->StatefulTask单步前进(相当于提交状态为“完成”)
stepBack(...)->StatefulTask单步后退(相当于提交状态为“回退”)

FlowStatefulService 一组用于“等待介入”场景的接口(中间需要参与者介入):

接口描述
getTask(...)->StatefulTask获取当前参与者的任务
getTasks(...)->Collection<StatefulTask>获取下一步所有任务
postOperation(...)提交操作(会产生“前进”或“后退”的效果)
postOperationIfWaiting(...)提交操作(会检测是否在等待参与者操作)

3、状态类型 StateType 和 操作 Operation

StateType

状态代码描述
UNKNOWN0未知(也表过无权限操作)
WAITING1001等待(也表过有权限操作)
COMPLETED1002完成(或通过)
TERMINATED1003终止(或否决)

Operation

状态代码描述
UNKNOWN0未知
BACK1010后退(或撤回)
BACK_JUMP1011跳转后退。v3.4.3 后支持
FORWARD1020前进(或通过)
FORWARD_JUMP1021跳转前进。v3.4.3 后支持
TERMINATED1030终止(或否决)
RESTART1040重新开始)

4、状态控制 StateController 和 状态仓库 StateRepository

  • StateController
public interface StateController {
    /**
     * 是否可操作的
     */
    boolean isOperatable(FlowContext context, Node node);

    /**
     * 是否自动前进
     */
    default boolean isAutoForward(FlowContext context, Node node) {
        return node.getType() == NodeType.END;
    }
}
  • StateRepository
public interface StateRepository {
    /**
     * 获取状态
     */
    StateType getState(FlowContext context, Node node);

    /**
     * 推入状态
     */
    void putState(FlowContext context, Node node, StateType state);

    /**
     * 移除状态
     */
    void removeState(FlowContext context, Node node);

    /**
     * 清空
     */
    void clearState(FlowContext context);
}