flow - 流程驱动器的组搭和定制
流程驱动器(FlowDriver)的相关接口,主要有三个:
接口 | 描述 |
---|---|
FlowDriver | 流程驱动接口定义 |
AbstractFlowDriver | 虚拟流程驱动器,实现基本能力,并抽象出:脚本运行接口(Evaluation)和组件容器接口(Container)。一般做为基类使用 |
SimpleFlowDriver | 简单流程驱动器。以 AbstractFlowDriver 为基础,提供 Evaluation 和 Container 组搭支持。且,同时支持无状态、有状态两种场景 |
有状态是指:活动节点会有等待、完成、退回、重新开始等状态(或指令)。应用场景不同。
1、SimpleFlowDriver 的默认状态
当使用默认构造时,默认会使用 LiquorEvaluation 脚本执行器和 SolonContainer 组件容器。
SimpleFlowDriver flowDriver = new SimpleFlowDriver();
流程引擎,默认的驱动器就是这个状态。
2、SimpleFlowDriver 的简单组搭
可选的组搭组件(也可以,自己定制)
组件 | 类型 | 描述 |
---|---|---|
组件容器 | 用于管理任务组件 | |
MapContainer | 组件容器 | 基于 Map 实现的组件容器(适合无容器环境) |
SolonContainer | 组件容器 | 对接 solon 的组件容器 |
脚本执行器 | 用于支持条件与任务脚本 | |
LiquorEvaluation | 脚本执行器 | 基于 liquor 实现,支持完整 java 语法。(权限很大,要做好安全控制) |
AviatorEvaluation | 脚本执行器 | 基于 aviator 实现,支持完整 aviator 语法 |
BeetlEvaluation | 脚本执行器 | 基于 beetl 实现,支持完整 beetl 语法 |
MagicEvaluation | 脚本执行器 | 基于 magic 实现,支持完整 magic 语法 |
- AviatorEvaluation,需要引入包:
org.noear:solon-flow-eval-aviator
- BeetlEvaluation,需要引入包:
org.noear:solon-flow-eval-beetl
- MagicEvaluation,需要引入包:
org.noear:solon-flow-eval-magic
简单组搭示例:
//构建组件容器
MapContainer container = new MapContainer();
container.putComponent("DemoCom", (ctx, node)->{
System.out.println(node.getId());
});
//构建驱动
SimpleFlowDriver flowDriver = new SimpleFlowDriver(container);
//构建引擎
FlowEngine engine = FlowEngine.newInstance();
engine.register(flowDriver);
//-----
//动态构建链,并执行
Chain chain = new ChainDecl("c1").create(decl -> {
decl.addNode(NodeDecl.activityOf("n1").task("@DemoCom"));
});
engine.eval(chain.getNode("n1"), FlowContext.of());
3、驱动器定制参考
驱动器的定制,可以基于 AbstractFlowDriver 或 SimpleFlowDriver 进行重写与扩展(比较重),也可以定制脚本执行器和组件容器进行组搭(比较轻)。
定制脚本执行器参考 AviatorEvaluation:
public class AviatorEvaluation implements Evaluation {
@Override
public boolean runTest(FlowContext context, String code) {
return (Boolean) AviatorEvaluator.execute(code, context.model());
}
@Override
public void runTask(FlowContext context, String code) {
AviatorEvaluator.execute(code, context.model());
}
}
//应用
//SimpleFlowDriver flowDriver = new SimpleFlowDriver(new AviatorEvaluation());
定制组件容器参考 SpringContainer(比如把它应用到 Spring 环境):
@Component
public class SpringContainer implements Container, ApplicationContextAware {
private ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext context) {
this.context = context;
}
@Override
public Object getComponent(String componentName) {
return context.getBean(componentName);
}
}
//应用
//@Configuration
//public class FlowEngineConfig {
// @Bean
// public FlowEngine flowEngine(SpringContainer container) {
// FlowEngine flowEngine = FlowEngine.newInstance(new SimpleFlowDriver(container));
//
// flowEngine.load("classpath:flow/*.yml")
//
// return flowEngine;
// }
//}