Solon v3.5.0

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 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;
//    }
//}