Solon v3.1.2

flow - 驱动器和任务、条件描述

</> markdown

solon-flow 采用开放式架构

  • 支持流驱动器(FlowDriver)定制
  • 节点“任务”与连接“条件”的描述没有固定格式,是由流驱动器(FlowDriver)的处理决定
  • 使用哪个(或定制的) FlowDriver 就采用哪种格式描述

就像 jdbc 的 Driver, mysql 和 pgsql 的语法各不同。

1、默认格式(SimpleFlowDriver 方案,框架内置)

示例
任务描述或者 @com1@开头,任务组件风格)
或者 #chain1#开头,跨链调用风格)
或者 $script1$开头,引用链的元信息作为脚本风格)
或者 context.result=1; (直接脚本风格。默认为完整的 Java 语法)
条件描述user_id > 12(表达式风格,要求结果为布尔值。默认为完整的 Java 语法)
  • 任务组件风格

@开头,表过调用对应名字的组件。

@Component("com1") //任务组件
public class TaskComponentT implements TaskComponent {

    @Override
    public void run(FlowContext context, Node node) throws Throwable {
        
    }
}
  • 跨链调用风格(相当于子流程)

#开头,表示调用引擎实例内的对应id的链。通过定制,也可对接 solon faas 的能力。

  • 引用链的元信息作为脚本风格

$开头,表示引用链的元信息key(支持多层次)。可以让 layout 部分更清爽,又不使用“任务组件”(清爽的实现,单文配置件完成所有的处理)。

id: "c8"
title: "计算编排"
layout:
  - { type: "start"}
  - { task: 'context.result=1;'} #初始化 result 值,用于后面计算
  - { when: "1=1", task: '$script.script1'} 
  - { task: '$script2'}
  - { type: "end"}
meta:
  script:
    script1: |
      context.result=((int)context.result)+1;
  script2: |
    context.result=((int)context.result)+1;
  • 直接脚本风格(默认支持完整的 Java 语法。其它脚本可定制驱动实现)

SimpleFlowDriver 的脚本能力,默认由 Liquor 提供。contextcontext.model() 里的变量在脚本里可直接使用。

//任务脚本(示例1)//完整的 java 代码
context.result=1;

//任务脚本(示例2)//完整的 java 代码
if(order_id > 0) { //order_id 即为模型里的变量: context.get("order_id")
    System.out.println("订单号: " + order_id);
}

//===================

//条件脚本(示例1)//产生一个布尔结果
user_id > 12 //user_id 即为模型里的变量: context.get("user_id")

配置示例:

#c1.chain.yml
id: chain1
layout:
  - task: 'System.out.println("Hello world");'
#c2.chain.yml
id: c2
layout:
  - task: '@com1' #执行组件
  - task: '#chain1' #执行链(相当于子流程)
  - task: '$script1' #执行引用脚本
  - task: 'System.out.println("Hello world");' #直接执行脚本
meta:
  script1: |
    context.result=((int)context.result)+1;

2、驱动器定制后的节点任务、连接条件参考(RubberFlowDriver 方案,第三方的)

示例
任务描述F,tag/fun1;R,tag/rule1(dsl 风格)
条件描述m.user_id,>,12,A;m,F,$ssss(m),E(dsl 风格)