statefulflow - 状态服务相关接口
(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 封装) |
RedisStateRepository | Redis 状态仓库(基于 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
状态 | 代码 | 描述 |
---|---|---|
UNKNOWN | 0 | 未知(也表过无权限操作) |
WAITING | 1001 | 等待(也表过有权限操作) |
COMPLETED | 1002 | 完成(或通过) |
TERMINATED | 1003 | 终止(或否决) |
Operation
状态 | 代码 | 描述 |
---|---|---|
UNKNOWN | 0 | 未知 |
BACK | 1010 | 后退(或撤回) |
BACK_JUMP | 1011 | 跳转后退。v3.4.3 后支持 |
FORWARD | 1020 | 前进(或通过) |
FORWARD_JUMP | 1021 | 跳转前进。v3.4.3 后支持 |
TERMINATED | 1030 | 终止(或否决) |
RESTART | 1040 | 重新开始) |
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);
}