Solon v3.1.2

flow - 流驱动器的组搭和定制

</> markdown

流驱动器(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);
    }
}