Solon v3.1.2

solon-flow-stateful [预览]

</> markdown
<dependency>
    <groupId>org.noear</groupId>
    <artifactId>solon-flow-stateful</artifactId>
    <version>3.1.3-SNAPSHOT</version>
</dependency>

1、描述

(v3.1.3 后支持)流处理扩展插件。在 Solon Flow 基础上提供有状态的流服务。比如 OA 审批。

2、应用示例

配置参考

# f1.yml
id: f1
layout:
  - {id: step1, title: "发起审批", type: "start"}
  - {id: step2, title: "抄送", meta: {cc: "吕方"}, task: "@OaMetaProcessCom"}
  - {id: step3, title: "审批", meta: {actor: "陈鑫", cc: "吕方"}, task: "@OaMetaProcessCom"}
  - {id: step4, title: "审批", type: "parallel", link: [step4_1, step4_2]}
  - {id: step4_1, meta: {actor: "陈宇"}, link: step4_end}
  - {id: step4_2, meta: {actor: "吕方"}, link: step4_end}
  - {id: step4_end, type: "parallel"}
  - {id: step5, title: "抄送", meta: {cc: "吕方"}, task: "@OaMetaProcessCom"}
  - {id: step6, title: "结束", type: "end"}

定义任务组件,用于处理基于元信息处理的任务

@Component("OaMetaProcessCom")
public class OaMetaProcessCom implements TaskComponent {
    @Override
    public void run(FlowContext context, Node node) throws Throwable {
        String cc = node.getMeta("cc");
        if (Utils.isNotEmpty(cc)) {
            //发送邮件...
            System.out.println("----------已抄送: " + cc + ", on node-id: " + node.getId());
        }
    }
}

实例化引擎实例

@Component
public class DemoConfig {
    @Bean
    public StatefulFlowEngine flowEngine() throws Throwable {
        //
        // 状态操作和状态仓库,可进行定制
        //
        StatefulFlowEngine flowEngine = new StatefulFlowEngine(StatefulSimpleFlowDriver.builder()
                .stateOperator(new SimpleStateOperator("actor"))
                .stateRepository(new InMemoryStateRepository()) // 内存型仓库,主要为了演示
                .build());

        //加载流程配置
        flowEngine.load("classpath:flow/oa/*.yml");
        
        return flowEngine;
    }
}

应用测试

@SolonTest
public class DemoTest {
    @Inject
    StatefulFlowEngine flowEngine;
    
    @Test
    public void case1() throws Throwable {
        StatefulFlowContext context;
        StatefulNode statefulNode;

        context = new StatefulFlowContext("i1").put("actor", "陈鑫");
        statefulNode = flowEngine.getActivityNode("f1", context);

        assert "step2".equals(statefulNode.getNode().getId());
        assert StateType.UNDEFINED == statefulNode.getState(); //没有权限启动任务(因为没有配置操作员)

        /// ////////////////
        //提交活动状态
        flowEngine.postActivityState(context, "f1", statefulNode.getNode().getId(), StateType.PASS);

        context = new StatefulFlowContext("i1").put("actor", "陈鑫");
        statefulNode = flowEngine.getActivityNode("f1", context);

        assert "step3".equals(statefulNode.getNode().getId());
        assert StateType.WAIT == statefulNode.getState(); //等待当前用户处理(有权限操作)
    }
}