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 Chain("c1");
chain.addNode(NodeDecl.activityOf("n1").task("@DemoCom"));
engine.eval(chain.getNode("n1"), new FlowContext());
3、驱动器定制参考
驱动器的定制,可以基于 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();
//
// flowEngine.register(new SimpleFlowDriver(container));
// flowEngine.load("classpath:flow/*.yml")
//
// return flowEngine;
// }
//}
定制流驱动器参考 SimpleFlowDriverEx,支持引用链元信息的配置作为脚本(默认已内置了):
public class SimpleFlowDriverEx extends SimpleFlowDriver {
@Override
protected void tryAsScriptTask(FlowContext context, Task task, String description) throws Throwable {
//按脚本运行
if (description.startsWith("$")) {
String metaName = description.substring(1);
description = (String) getDepthMeta(task.getNode().getChain().getMetas(), metaName);
if (Utils.isEmpty(description)) {
throw new FlowException("Chain meta not found: " + metaName);
}
}
super.tryAsScriptTask(context, task, description);
}
}