# 服务

概述: 服务是低开的重要组成部分,用图形化的方式来描述业务处理逻辑。 服务可以运用在流程,表单和服务实体当中,使用图元赋值、调用运算逻辑、调用EOS服务、调用子逻辑流和REST服务等操作将小粒度的运算构件组装成业务逻辑。

# 本部分包括内容:

  • 创建服务

  • 服务图元

    • 开始

    • 结束

    • 逻辑流

    • 运算逻辑

    • Rest服务

    • Eos服务

    • 脚本

  • 调试

# 创建服务

  • 创建前提

    服务创建是在低开的构建包中,创建服务之前需要先创建构建包,具体参考构建包创建

# 新建服务

构建包创建完毕后,内容包括实体、页面、流程、服务四种。

  1. 右键点击服务,选择新建服务

    创建服务

  2. 弹出信息页面,填写服务编码(必填),显示名称,描述等基本信息。类型默认为通用类型,具体请参考下面的服务类型

    填写信息

  3. 新创建出来服务没有内容,并且此时服务显示名称上带红色感叹号,代表编译未通过。

    新服务

  4. 从服务左侧选择逻辑图元,完善图元内容,此处示例选择赋值图元,将图元用连接线连接,最后点击页面右上角的保存按钮(CTRL+S也可保存),服务保存即发布。刷新资源,可看到红色感叹号已消失,至此,服务创建完毕,接下来便可以在表单或流程选择服务使用。

    创建完毕

# 服务类型

服务共有三种类型,分别是通用业务实体服务流程事件。选择不同类型,创建出来的服务会放在相应的类型下面,用来区分服务。

  • 通用服务

    通用服务没有特殊含义,也没有模板可供选择,创建出来的服务只包含有开始和结束图元。

    新服务

  • 实体服务

    实体服务,代表供实体使用的服务,一般指服务实体中服务配置里面的五个服务和表单的触发事件服务。

    1. 新建服务选择实体服务,填写服务编码等信息,点击使用模板的选择框,可以看到新增、删除、修改、分页查询、用ID查询五个模板可供选择,分别对应服务实体服务配置的五种服务。

      实体服务

    2. 示例选择新增模板,点击创建,此时新建服务里面已经建好了业务逻辑,调用低开自带的运算逻辑新增数据。

      新增实体服务

    3. 双击画布空白处,可查看服务的入参、出参配置,除models数据类型,其他为低开里面固定参数,不能修改!修改模板同理,按需将models的数据类型修改成相对应的数据实体。

      服务配置

    4. 双击运算逻辑,可以查看运算逻辑的参数配置,是服务定义的参数,可以按需替换成适合业务逻辑实现的图元,但图元的参数要和服务的入参、出参保持一致!

      图元配置

注意:

服务的models参数的数据类型,需要按需替换成想要使用的实体,点击数据类型,选择自己的实体即可!

  • 流程事件

    流程事件,代表供流程使用的服务,指流程中活动的业务事件服务。

    1. 新建服务选择流程事件,填写服务编码等信息,点击使用模板的选择框,可以看到按钮事件模板。

      流程事件

    2. 示例选择新增模板,点击创建,此时新建服务里面已经建好了业务逻辑,调用REST服务去实现自己的业务逻辑。

      服务详情

    3. 双击画布空白处,可查看服务的入参、出参配置,参数在低开已规定,不能修改

      服务参数

    4. 双击REST服务图元,可以查看REST服务图元的参数配置,是服务定义的参数,参数不可修改。

      远程URL为REST服务所访问的真实URL;

      Http Method为访问方法的请求类型;

      如本机8080服务,URL为/users的GET请求,则远程URL为127.0.0.1:8080/users,Http Method为GET;

      REST服务图元

注意:

如果流程事件服务被流程中业务事件的提交、保存操作使用,则所调用的REST服务必须返回保存数据的主键值。

# 服务图元

一个图元表示一个基本的处理单元,例如调用一个Java方法对应一个图元,调用服务也对应一个图元,开始和结束也有一个图元相对应。

# 开始图元

开始图元开始图元表示一个服务的开始,表示当前服务的入口,开始图元只能有一个。

开始图元属性设置界面包含"显示名称"和"简单描述"。可以修改开始图元的显示名称。 属性

# 结束图元

结束图元结束图元表示一个服务的结束,代表当前服务的出口,一个逻辑流可以有一个或者多个结束图元(表示该逻辑流有多个出口)。

结束图元属性设置界面包括"显示名称"和"描述",可以修改结束图元的显示名称,也可双击结束图元查看返回值。 结束属性

注意:

结束图元的返回值,不可自己在结束图元上设置,应该双击画布空白处,在服务设置上添加返回值,此时结束图元会自动将返回值参数显示出来。

# 返回值有三个返回值类别,分别是变量、常量、表达式。

返回值类别

  • 变量

    可以使用在逻辑流中定义的变量,表示将该变量对应的值作为返回值;对于返回值采用传引用的方式。

  • 常量

    对应设置的返回值为一个字符串,表示该字符串作为返回值。

  • 表达式

    表示将该表达式的结果作为返回值。目前仅支持Java表达式,需要符合Java规范。在表达式中可以使用隐含变量,表达式只能有一行。 例如:name.equals("primeton")中name是逻辑流的一个变量,该表达式返回的boolean类型数据作为返回值。

# 赋值图元

赋值图元赋值图元提供了对变量赋值的功能、可以对一个或多个可赋值变量进行赋值。

可赋值变量包括:已定义变量、已定义变量属性(当变量是SDO DataObject、Java对象、数据实体时)、未定义变量、未定义变量属性(当变量是SDO DataObject、Java对象、数据实体时)。

未定义变量只有在运行的时候才知道左值的类型,将会根据右值的类型为左值进行赋值;如果左值是一个已经定义过的变量,右值需要与左值是相同类型或者其子类型,如果类型不匹配,运行过程中将会抛出运行期异常(ClassCaseException)。

赋值图元属性设置界面如下图所示。 界面

# 参数意义

  • 左值

    左值为一个可赋值变量,如果变量是数组类型,也可以给数组中的一个元素赋值。输入一个可赋值变量。 默认为"leftN","N"从1开始顺序增加。

    • 变量

      格式:直接输入变量名

    • 变量属性

      格式:变量名/变量属性名

      变量是一个Java类型,可以通过XPath的方式给Java的属性赋值。例如:User对象有name、age、id等属性,可以通过XPath:User/name给name属性赋值。

    • 数组中的元素

      格式:目前支持以下2种格式

      • 下标方式:采用[],下标从1开始
      • 打点方式:采用.方式,下标从0开始 如name为数组,给第一个元素赋值,采用下标方式为name[1];采用打点方式为name.0。

说明:如果左值是List类型,右值是Array;或者左值是Array,右值是List,这样的赋值都是传值。另外如果左值是Array,右值也是Array,这样的赋值也是传值。

  • 右值

    根据"值类别"不同,分别输入字符串、变量名称或Java表达式。

    • 常量 表示右值赋给左值的是常量。此时赋值方式必须为"传值"。 右值为常量的情况下,不允许不输入任何值;Studio会做编译检查。 例如左值的类型是字符串,右值是"5",相当于左值 = "5"。

    • 变量

      右值是值对象的名称或者引用路径,相当于左值=name。例如name、name[1]、name.0、user/age等。 此时赋值方式支持"传值"和"传引用"2种。

      • 传值

        变量必须实现序列化或者提供clone的功能;

      • 传引用

        相当于左值和右值指向同一个对象的引用,如果其中任何一个的修改都会同时影响到左值和右值。

  • 表达式

    将单行表达式结果赋值给左值,相当于id=(name==age)。此时赋值方式无意义。 Java表达式为一行JAVA表达式,返回值必须是布尔类型。例如:name.equals("pimeton")。在Java表达式中,可以使用隐含变量。访问当前逻辑流上下文中的数据,逻辑流上下文隐含变量:context; 访问会话上下文中的数据,会话上下文隐含变量:sessionContext 这两个隐含变量均实现了IDataContext接口,可以使用该接口提供的一系列get方法来获取值。

说明:用户如果希望给变量赋值空字符串或者null,可以选择右值类别为"表达式",空字符串输入"",空对象输入null。

# 逻辑流图元

在逻辑流中支持调用其它逻辑流,作为其子逻辑流。通过逻辑流调用逻辑流可实现更大范围内逻辑流的组装。

逻辑流图元逻辑流图元属性设置界面包含"设置"、"高级"和"描述"三个页签。下面分别介绍各个页签如何设置数据。

界面

# 设置页签

  • 逻辑流名称

    点击逻辑流名称可以选择当前应用下,所有构建包下的逻辑流,包括EOS.FOUNDATION包。

    逻辑流名称

  • 参数配置表

    参数配置表为已选择的逻辑流的定义参数和返回值,不可修改。

    参数配置表

    • 类型

      类型包括"参数"和"返回值"。

      • 参数:

        表示传入被调用子逻辑流的参数,在子逻辑流内部可以直接使用该参数。 参数数据的流向:将当前逻辑流的值传入到被调用的子逻辑流中。

      • 返回值

        表示将被调用的子逻辑流计算的结果返回出来,放入当前的返回值变量中。返回值数据传递的过程和参数数据传递的过程相反。 返回值数据的流向:将被调用子逻辑流的执行结果返回到调用的逻辑流中。

    • 名称

      "参数"或"返回值"的名称。系统自动生成,不可编辑。

    • 数据类型

      "参数"或"返回值"的数据类型。系统自动生成,不可编辑。

    • 值是逻辑流定义的参数,此处可直接选择已定义好的参数。也可手动输入。根据"值类别"不同,分别输入字符串、变量名称或Java表达式。

      • 常量

        常量表示当前参数值是String字符串。此时传递方式没有任何意义。

      • 变量

        变量支持已经定义的变量、sessionContext中的变量(m:开头),该变量的传递方式支持"传值"和"传引用"2种。同传递方式。

      • 表达式

        必须符合Java规范,可以使用不同数据区来获取数据,可以使用已经定义的变量。表达式的传递方式支持"传值"和"传引用"2种。同传递方式。

    • 值类别

      通过下拉列表框选择"常量"、"变量"或"表达式"。默认值为"变量"。"类型"为"返回值"时,只能选择"变量"。

      当类别为常量时,如果不输入任何内容,按照如下规则处理: 如果参数是基本类型,取默认值;如果是对象,取null。

    • 传递方式

      通过下拉列表框选择"传值"或"传引用"。默认值为"传引用"。

      • 传值:当前变量需要支持序列化或者实现了clone接口;
      • 传引用:相当于两者指向同一个对象,如果对象发生了变化,两者都能体现出来。

# 高级页签

高级页签用来设置子逻辑流的事务。

高级页签

  • 事务传播方式

    在逻辑流中调用一个子逻辑流时,可以为子逻辑流设置事务传播方式,支持Join和Suspend两种方式。默认值为"Join"。

    • Join

      表示子逻辑流的事务加入到父逻辑流的事务中;

    • Suspend

      表示以挂起方式调用子逻辑流。如果父逻辑流有事务,子逻辑流会挂起外部事务,在子逻辑流内部单独启用一个事务。

  • 调用方式

    调用子逻辑流支持同步、异步两种方式。在异步调用方式下,逻辑流的返回值会被忽略。异步调用会启动另外一个线程(tomcat服务器),或者通过JMS的方式来执行当前的逻辑。 异步方式下:按照引用传递的变量不会同步到主线程中。

# 描述页签

描述页签,可以填写对改逻辑流的描述信息。

# 运算逻辑图元

在逻辑流中可以调用运算逻辑。调用运算逻辑图元运算逻辑属性设置界面包含"设置"、"高级"和"描述"三个页签,描述页签代表该运算逻辑的描述信息。如下图所示。下面分别介绍各个页签如何设置数据。

界面

# 设置页签

  • 选择运算逻辑

运算逻辑支持选择高开的运算逻辑。

设置页签

  • 参数配置表

      参数配置表组合框中的参数设置请参见逻辑流图元的参数配置表。
    
  • 高级页签

      高级页签的配置请参见逻辑流图元的高级页签配置。
    

# REST服务图元

逻辑流中可以直接调用一个REST服务。REST服务图元REST服务图元属性设置界面包括“设置”和“描述”两个页签,描述页签代表改REST服务的描述信息。

REST界面

# 设置页签

  • 远程URL

    远程URL是调用的远程服务的URL地址和端口,需要填写完整的URL路径,包括IP和端口号。

  • Http Method

    Http Method中选择调用远程服务的方式,可选方式有PUT、GET、DELETE、HEAD、OPTIONS、POST。

  • 参数配置表

    参数配置表可以增加远程服务的入参和出参,每个参数的值,每个值可以是常量,变量(一个Xpath)或一个表达式,这些参数的值将传递给被调用的方法。

    参数和返回值的增加删除通过参数配置表右边的图标来控制

    参数增减

    • 类型

      类型包括参数和返回值两种。

    • 名称

      "参数"或"返回值"的名称。和远程服务的参数名称保持一致。

    • 数据类型

      "参数"或"返回值"的数据类型。点击框可以选择数据类型,包括基础类型和低开定义实体类型。和远程服务的参数数据类型保持一致

    • 数组

      "参数"或"返回值"是否为数组,是的话勾选,默认不勾选。

    • 传参类型

      远程服务里,入参的传参类型。包括URL、QUERY、BODY、MULTI_BODY、HEADER五种类型。

      • URL

        URL代表参数在URL路径上,需要手动将参数名拼在URL上,支持路径变量,例如127.0.0.1:8080/query?id={id}的配置如下

        URL配置

      • QUERY

        QUERY同样代表将参数配置在URL路径上,和URL不同的是不需要手动拼接参数名,例如127.0.0.1:8080/query?id={id},QUERY不需要拼id,只需要填写url路径127.0.0.1:8080/query即可。

      • BODY

        BODY表示参数放在请求体里面,远程服务该参数可以用RequestBody注解接收。

      • MULTI_BODY

        MULTI_BODY同样表示参数放在请求体里面。

      • HEADER

        HEADER表示参数放在请求头里面传递。

    • 值、值类别

        值和值类别请参见逻辑流图元的参数配置表中的配置。
      

# EOS服务图元

EOS服务EOS服务调用图元能方便调用其他应用暴露出来的EOS服务,设置服务的URL以及参数即可。

界面

# 设置页签

  • EOS服务

    EOS服务可以选择其他应用暴露出来的已发布服务。

  • 远程URL

    已选择的服务的远程URL,需要手动修改IP和端口为实际服务的IP和端口。

  • 参数配置表

      请参见逻辑流图元的参数配置表配置。
    

# 脚本图元

服务中提供了脚本编写能力,使服务符合业务场景。 逻辑流中可以直接调用一个脚本。脚本图元脚本图元包含“设置”和“描述”两个页签,描述页签用来完善脚本图元的描述信息。

界面

# 设置页签

  • 显示名称

    脚本的显示名称。

  • Groovy脚本

    脚本内容的编写,具体编写规则和Groovy脚本编写规则一样。并且,在Groovy脚本编写中,可以获取逻辑流定义参数来使用。直接输入参数名称便可以获取该参数。

# 调试

服务提供了在线调试功能,方便解决服务开发过程中遇到的问题。

现有一个服务示例,如下图,赋值图元将参数params赋值给返回值out。

调试

# 调试步骤

  1. 右键点击服务,在选项中选择“执行”。

    执行

  2. 在调试页面填写参数信息

    信息填写

  • 入参配置表

    • 值是参数的值,可以自行输入;

    • 名称、数据类型、数组、描述都是参数的配置,自动映射,不可修改。

  1. 点击执行

  2. 结果查看

    结果为整个服务的数据结构。“data”数据区的“out”内容变为返回值结果。

    结果查看

上次更新: 2023/3/20下午3:44:43