# 服务
概述: 服务是低开的重要组成部分,用图形化的方式来描述业务处理逻辑。 服务可以运用在流程,表单和服务实体当中,使用图元赋值、调用运算逻辑、调用EOS服务、调用子逻辑流和REST服务等操作将小粒度的运算构件组装成业务逻辑。
# 本部分包括内容:
创建服务
服务图元
开始
结束
逻辑流
运算逻辑
Rest服务
Eos服务
脚本
调试
# 创建服务
创建前提
服务创建是在低开的构建包中,创建服务之前需要先创建构建包,具体参考构建包创建
# 新建服务
构建包创建完毕后,内容包括实体、页面、流程、服务四种。
右键点击服务,选择新建服务
弹出信息页面,填写服务编码(必填),显示名称,描述等基本信息。类型默认为通用类型,具体请参考下面的服务类型
新创建出来服务没有内容,并且此时服务显示名称上带红色感叹号,代表编译未通过。
从服务左侧选择逻辑图元,完善图元内容,此处示例选择赋值图元,将图元用连接线连接,最后点击页面右上角的保存按钮(CTRL+S也可保存),服务保存即发布。刷新资源,可看到红色感叹号已消失,至此,服务创建完毕,接下来便可以在表单或流程选择服务使用。
# 服务类型
服务共有三种类型,分别是通用业务、实体服务、流程事件。选择不同类型,创建出来的服务会放在相应的类型下面,用来区分服务。
通用服务
通用服务没有特殊含义,也没有模板可供选择,创建出来的服务只包含有开始和结束图元。
实体服务
实体服务,代表供实体使用的服务,一般指服务实体中服务配置里面的五个服务和表单的触发事件服务。
新建服务选择实体服务,填写服务编码等信息,点击使用模板的选择框,可以看到新增、删除、修改、分页查询、用ID查询五个模板可供选择,分别对应服务实体服务配置的五种服务。
示例选择新增模板,点击创建,此时新建服务里面已经建好了业务逻辑,调用低开自带的运算逻辑新增数据。
双击画布空白处,可查看服务的入参、出参配置,除models的数据类型,其他为低开里面固定参数,不能修改!修改模板同理,按需将models的数据类型修改成相对应的数据实体。
双击运算逻辑,可以查看运算逻辑的参数配置,值是服务定义的参数,可以按需替换成适合业务逻辑实现的图元,但图元的参数要和服务的入参、出参保持一致!
注意:
服务的models参数的数据类型,需要按需替换成想要使用的实体,点击数据类型,选择自己的实体即可!
流程事件
流程事件,代表供流程使用的服务,指流程中活动的业务事件服务。
新建服务选择流程事件,填写服务编码等信息,点击使用模板的选择框,可以看到按钮事件模板。
示例选择新增模板,点击创建,此时新建服务里面已经建好了业务逻辑,调用REST服务去实现自己的业务逻辑。
双击画布空白处,可查看服务的入参、出参配置,参数在低开已规定,不能修改!
双击REST服务图元,可以查看REST服务图元的参数配置,值是服务定义的参数,参数不可修改。
远程URL为REST服务所访问的真实URL;
Http Method为访问方法的请求类型;
如本机8080服务,URL为/users的GET请求,则远程URL为127.0.0.1:8080/users,Http Method为GET;
注意:
如果流程事件服务被流程中业务事件的提交、保存操作使用,则所调用的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服务的描述信息。
# 设置页签
远程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}的配置如下
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服务,设置服务的URL以及参数即可。
# 设置页签
EOS服务
EOS服务可以选择其他应用暴露出来的已发布服务。
远程URL
已选择的服务的远程URL,需要手动修改IP和端口为实际服务的IP和端口。
参数配置表
请参见逻辑流图元的参数配置表配置。
# 脚本图元
服务中提供了脚本编写能力,使服务符合业务场景。 逻辑流中可以直接调用一个脚本。脚本图元包含“设置”和“描述”两个页签,描述页签用来完善脚本图元的描述信息。
# 设置页签
显示名称
脚本的显示名称。
Groovy脚本
脚本内容的编写,具体编写规则和Groovy脚本编写规则一样。并且,在Groovy脚本编写中,可以获取逻辑流定义参数来使用。直接输入参数名称便可以获取该参数。
# 调试
服务提供了在线调试功能,方便解决服务开发过程中遇到的问题。
现有一个服务示例,如下图,赋值图元将参数params赋值给返回值out。
# 调试步骤
右键点击服务,在选项中选择“执行”。
在调试页面填写参数信息
入参配置表
值是参数的值,可以自行输入;
名称、数据类型、数组、描述都是参数的配置,自动映射,不可修改。
点击执行
结果查看
结果为整个服务的数据结构。“data”数据区的“out”内容变为返回值结果。