workflow - 工作流服务相关接口
2025年12月21日 下午2:31:26
WorkflowService 是在 Solon Flow 的基础上,通过驱动定制和封装实现的轻量级工作流引擎
状态服务相关的主要接口包括:
| 主要接口 | 描述 |
|---|---|
| WorkflowService | 工作流服务接口 |
| Task | 工作任务 |
| TaskAction | 任务动作 |
| TaskState | 任务状态 |
| StateController | 状态控制器接口。提供状态控制(是否可操作,是否自动前进) |
| StateRepository | 状态仓库接口。提供状态保存与获取 |
StateController 框架内提供有(也可按需定制):
| 实现 | 描述 |
|---|---|
| BlockStateController | 阻塞状态控制器(所有节点有权操作,类似超级管理员) |
| NotBlockStateController | 不阻塞状态控制器(像无状态一样执行,除非中断,中断处可恢复执行)。v3.5.0 后支持 |
| ActorStateController | 参与者状态控制器(节点元数据匹配参与者后有权操作,没有配置的会自动前进) |
StateRepository 框架内提供有(也可按需定制):
| 实现 | 描述 |
|---|---|
| InMemoryStateRepository | 内存状态仓库(基于 Map 封装) |
| RedisStateRepository | Redis 状态仓库(基于 Redis 封装) |
2、Task 属性
| 操作 | 描述 |
|---|---|
run(context) | 运行当前节点任务(如果有?) |
getNode():Node | 获取当前节点(进则获取节点的元数据) |
getNodeId():String | 获取当前节点Id(v3.8.0 后支持) |
getState():StateType | 获取当前节点“状态类型”(等待、完成、等...) |
获取示例:
Task task = workflow.getTask("g1", context);
3、WorkflowService 构建
@Configuration
public class DemoCom {
@Bean
public WorkflowService demo(FlowEngine flowEngine) {
return WorkflowService.of(engine,
new ActorStateController(),
new InMemoryStateRepository());
}
}
WorkflowService 一组用于“审批”场景的接口(中间需要参与者介入。一般配合 ActorStateController):
| 接口 | 描述 |
|---|---|
getTask(...)->Task | 获取当前参与者的任务 |
getTasks(...)->Collection<Task> | 获取下一步所有任务 |
postTask(...) | 提交操作(会产生“前进”或“后退”的效果) |
postTaskIfWaiting(...) | 提交操作(会检测是否在等待参与者操作) |
4、 WorkflowService 接口参考
public interface WorkflowService {
static WorkflowService of(FlowEngine engine, StateController stateController, StateRepository stateRepository) {
return new WorkflowServiceDefault(engine, stateController, stateRepository);
}
/**
* 当前流程引擎
*/
FlowEngine engine();
/// ////////////////////////////////
/**
* 提交操作(如果当前任务为等待介入)
*
* @param graphId 图id
* @param nodeId 节点id
* @param action 动作
* @param context 流上下文
*/
boolean postTaskIfWaiting(String graphId, String nodeId, TaskAction action, FlowContext context);
/**
* 提交操作(如果当前任务为等待介入)
*
* @param graph 图
* @param nodeId 节点id
* @param action 动作
* @param context 流上下文
*/
boolean postTaskIfWaiting(Graph graph, String nodeId, TaskAction action, FlowContext context);
/**
* 提交操作(如果当前任务为等待介入)
*
* @param node 节点
* @param action 动作
* @param context 流上下文
*/
boolean postTaskIfWaiting(Node node, TaskAction action, FlowContext context);
/**
* 提交操作
*
* @param graphId 图id
* @param nodeId 节点id
* @param action 动作
* @param context 流上下文
*/
void postTask(String graphId, String nodeId, TaskAction action, FlowContext context);
/**
* 提交操作
*
* @param graph 图
* @param nodeId 节点id
* @param action 动作
* @param context 流上下文
*/
void postTask(Graph graph, String nodeId, TaskAction action, FlowContext context);
/**
* 提交操作
*
* @param node 节点
* @param action 动作
* @param context 流上下文
*/
void postTask(Node node, TaskAction action, FlowContext context);
/// ////////////////////////////////
/**
* 获取多个任务
*
* @param graphId 图id
* @param context 流上下文(不需要有人员配置)
*/
Collection<Task> getTasks(String graphId, FlowContext context);
/**
* 获取多个任务
*
* @param graph 图
* @param context 流上下文(不需要有人员配置)
*/
Collection<Task> getTasks(Graph graph, FlowContext context);
/**
* 获取当前任务
*
* @param graphId 图id
* @param context 流上下文(要有人员配置)
*/
Task getTask(String graphId, FlowContext context);
/**
* 获取当前任务
*
* @param graph 图
* @param context 流上下文(要有人员配置)
*/
Task getTask(Graph graph, FlowContext context);
/// ////////////////////////////////
/**
* 获取状态
*/
TaskState getState(Node node, FlowContext context);
/**
* 清空状态(主要方便测试)
*
* @param graphId 图id
* @param context 流上下文
*/
void clearState(String graphId, FlowContext context);
/**
* 清空状态(主要方便测试)
*
* @param graph 图
* @param context 流上下文
*/
void clearState(Graph graph, FlowContext context);
}