solon-flow-stateful [预览]
<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(); //等待当前用户处理(有权限操作)
}
}