服务编排设计器内节点说明

服务编排设计器内节点说明

image.png
说明
  • 您可以调用依赖限界上下文中的应用服务方法、轻应用内您自定义的服务方法及系统内置的服务方法。节点名称将默认为服务方法名称,您需要在调用节点内对入参赋值,并为方法输出绑定变量。

  • 对应用服务方法调用的节点中,您还能通过绑定变量的方式获取该服务调用返回值中的code、message信息。

服务编排节点

说明

调用

  • 服务调用:您可以基于已设置的数据源,创建服务调用,实现数据的输入输出。数据源类型有以下三种:

    BizWorks应用类型:

    ○ 选择数据源后,再选择内部要调用的接口,并进行请求参数配置。

    ○ 对响应结果进行内容的提取。

    REST API类型:

    ○ 选择数据源后,基于数据源的BaseURL,拼接出实际调用的接口路径。

    ○ 填入接口调用的请求参数。

    ○ 根据接口的返回结构,定义对应类型的变量,作为服务调用的返回值。

    MySQL类型:

    ○ 选择数据库后,可在SQL语句中写入单行脚本。

    ○ 支持在脚本中使用{{variable1+variable2}}格式设置表达式,以及调用服务编排内的变量和可用的BWEL表达式。关于BWEL表达式详情,请参见服务编排、逻辑流、工作流中的表达式语法及BWEL函数规则说明

    ○ 根据语句的返回结构,定义对应类型的变量,作为接口调用的返回值。

分支

If用于为流程创建多个分支流程,在节点中,您可以自定义分支名称,并通过表达式来定义分支条件,表达式的最终值类型需为Boolean。当不满足任何分支条件时,系统将会执行默认分支。

添加后可在属性面板上对每个分支进行设置,设置内容包括分支的条件、每个分支条件中通过组合一个或多个变量及条件运算符构成复杂条件编排。

循环

  • ForEach

    • 用于配置某些循环的流程。例如,对某个list变量内元素遍历并操作的场景,具体请参见如下代码示例:

      List<Structure_A> aList;
      for (Structure_A a : aList) {
          func(a);
      }
      • 在遍历节点内时,A可为任意类型:基础类型、集合类型或对象类型。集合变量为aList,条目变量则为a。循环中对a变量的操作,则在遍历循环节点内以通过节点编排的形式实现。1

      • 集合变量需要从流程现存变量中选取,条目变量由于只存在于循环内部,您只需要设定一个与流程内变量编码不重复的编码,即可创建以该编码为标识的循环内变量。以aLista为例,条目变量a在设定后,不会体现在整体流程的变量管理列表中,但在循环内,可从列表中获取。

    • While用于配置循环的流程,在While循环条件成立时,循环内设置的流程将重复执行。

      image.png

      如上图在Number类型的变量x小于100时,While内的流程将重复执行。

      image.png
    • Break:可被拖入循环类型的节点内部,终止所在循环。

    • Continue:可被拖入循环类型的节点内部,使当前流程进入下一个循环。

语句

  • 变量赋值:用于对变量进行赋值,您既可以通过另一个变量为变量赋值,也可以表达式的形式为变量赋值。例如,对于两个类型均为Integer的变量:ab,在为变量a赋值的表达式中写入:b+1,即可实现a=b+1形式的赋值。

    说明
    • 表达式的终值类型需和要赋值的变量类型相同。

    • 在同一个节点内,您可以为多个变量进行赋值,赋值操作的前后顺序可调。

  • 打印日志:用于在应用运行日志中打印内容,日志内容由表达式定义,表达式的最终值类型需为String。您可以通过打印出来的日志信息,快速定位和排查问题。

  • 自定义脚本:用于在服务编排中插入自定义脚本,在脚本中支持通过Groovy语言编写脚本来实现循环、分支、变量赋值及自定义函数等编排操作。

  • 结束节点:标志着流程的结束,在节点内可设定某变量为当前服务方法的出参。

    1
    说明

    如果流程出参的类型为:

    • 基本类型:支持通过值、变量、表达式赋值。

    • 集合类型:支持通过变量、表达式赋值。

    • 对象类型:支持通过变量、表达式赋值。

异常

异常抛出

  • 异常处理的触发条件使用表达式表达。

  • 异常编码(code)、异常信息(message)支持使用变量、值、表达式三种方式赋值。

  • 当触发条件被满足时,服务方法会停止执行,对外抛出在节点中定义的异常信息。

自定义脚本

变量调用

自定义脚本支持调用变量,变量范围包括:

  • 服务编排内定义的流程变量。

  • 服务编排内支持调用的静态变量。

变量调用方式:$bw作为Bizworks内置关键字,通过$bw.{变量名}即可对Variable变量值进行读取或修改。对于类型为结构对象的变量,支持通过$bw.{变量名}.{字段名}的方式调用变量内部的字段。

# 基础类型
// 修改
$bw.name="123"
//读取
String nameLocal = $bw.name

# 结构对象
$bw.user.name ="123"
String nameLocal = $bw.user.name

当静态变量和流程变量重名时,脚本中对变量的调用顺序和服务编排中相同,优先调用流程变量。

变量调用的注意事项

  • 无法在自定义脚本中修改静态变量。例如:定义静态变量为name$bw.name=222是非法的,引擎不会执行该语句。

  • 无法添加或修改尚未定义的变量。例如:

    • 用户未定义age变量,$bw.age=222是非法的,引擎会跳过该语句的执行。

    • 用户未定义age变量,String age =$bw.age,该语句执行后变量age的值为null

  • 循环节点中定义的迭代变量支持被自定义脚本内调用。例如:循环节点中,迭代变量是可以被其中的脚本节点通过$bw.变量名方式使用。

  • 不支持使用函数类关键字作为变量名,若将变量名定义为关键字如CollectionUtils,通过$bw.CollectionUtils语句返回的是函数类,并不会返回用户自定义的变量值。脚本节点关键字如下:

    • NumberUtils:数据计算函数类关键字。

    • LogicUtils: 逻辑计算关键字。

    • DateUtils : 时间函数。

    • CollectionUtils:集合函数。

  • 用户在脚本中使用的所有流程变量必须在前序节点中进行初始化(赋初值或对内部字段赋初值),否则为变量赋值后仍可能产生变量未赋值的报错,或消费类型为结构对象的变量中的某个属性时会出现空指针问题。当前引擎暂不会代替用户完成结构对象的初始化操作。

BWEL函数调用

自定义脚本中支持调用服务编排内的BWEL函数,可使用$bw.函数类名.函数名(参数) 的对BWEL函数进行调用,具体函数名称及入参设置参见BWEL函数说明。也支持在函数中写Groovy表达式:

# 调用MAX函数,执行数学计算MAX函数
$bw.NumberUtils.MAX(1,2,3)

# 调用IF函数,执行复杂表达式
$bw.LogicUtils.IF(2+3>5,"22"+"444","44");

# 抛出异常,异常中包含code、message信息
$bw.ExceptionUtils.throwException([code:"400",message:"自定义异常抛出"]);

BWEL函数调用的注意事项

  • 函数名称需要区分大小写。例如:使用MAX函数时写作max,会导致引擎无法识别该函数。

  • 无法对函数类进行赋值操作。例如:$bw.LogicUtils.name = "111" ,该语句无法生效。

  • 不支持使用函数类关键字作为变量名,若将变量名定义为关键字如CollectionUtils,通过$bw.CollectionUtils语句返回的是函数类,并不会返回用户自定义的变量值。脚本节点关键字如下:

    • NumberUtils:数据函数。

    • LogicUtils:逻辑函数。

    • StringUtils:文本函数。

    • DateUtils:时间函数。

    • CollectionUtils:集合函数。

    • ExceptionUtils:异常函数

Groovy使用约束

针对脚本运行时可能出现的安全风险,引擎对脚本允许引用的类做了一定的安全约束。

  • 脚本节点中能够直接使用的类如下:

    "com.google.common.collect.*",
    "java.util.*",
    "java.util.stream.*",
    "java.util.regex.*",
    "java.util.function.*",
    "java.lang.Math.*",
    "org.apache.commons.lang3.StringUtils"
  • 脚本节点中允许导入的类如下:

    "java.lang.Object",
    "java.lang.String",
    "java.lang.Boolean",
    "java.lang.StringBuffer",
    "java.lang.StringBuilder",
    "java.lang.Byte",
    "java.lang.Float",
    "java.lang.Integer",
    "java.lang.Long",
    "java.lang.Math",
    "java.lang.Short"

除去上述支持的类型和包外,其他类或者包都不得引入,引入后会导致引擎拒绝执行,脚本编译失败。

从数据源批量创建服务方法

  1. 服务编排页面,单击从数据源批量创建

  2. 从数据源批量创建服务方法面板的左侧导航栏中,选中目标接口。image.png

    说明

    单次最多只能创建10个服务方法。

  3. 单击保存

    系统自动创建服务方法包括以下内容:

    • 服务方法入参:服务方法的入参和接口的请求参数保持一致,包括参数名称编码参数类型描述必填

    • 服务方法出参:服务方法的出参和接口的响应参数保持一致,包括参数类型描述

    • 中间变量:如果应用服务方法有出参,则系统会自动创建一个中间变量,类型与出参相同。

    • 流程节点:系统自动生成一个开始节点、一个调用服务方法节点和一个结束节点,调用服务方法节点调用所选的接口,节点名称与应用服务方法名称相同,服务方法的入参作为参数传给接口,节点的出参赋值给中间变量

    • 结束节点:如果接口有响应参数,则系统会自动将output参数在结束节点赋值给服务方法的出参。

    系统提示保存成功,您可以在服务方法页面查看所创建的服务方法。1