Solon v3.7.3

workflow - 工作流服务相关接口

</> markdown
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 封装)
RedisStateRepositoryRedis 状态仓库(基于 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);
}