接口主配置
接口主配置主要完成的任务是接口的数据处理,业务逻辑实现,协议的解报组报等工作,一个接口的主要工作都取决于接口配置。我们可以在main目录下创建xml文件进行配置,本章内容就基础的配置对主接口进行介绍。
配置顺序:
a) public
b) interface
c) codetables(n)|functions(n)
d) connections
e) filters
f) errorCodes
1.1 确定唯一接口
1.接口平台通过interfaceid和transactionid两个字符串变量,可确定唯一的接口;
2.接口平台主配置下的XML文件名称(不带后缀.xml),必须和该XML文件中的interface节点的id保持一致。例如有cfg/main/account.xml 文件;
3.接口平台主配置/cfg/main/目录下支持子目录分层结构。
1.2 interface
在接口主配置root根节点下,存在有且只有一个的interface节点,用来定义多个transaction交易。
1.2.1 父节点
- root:xml文件根节点,无意义
1.2.2 子节点
- transaction:定义接口的交易,至少一个;
1.2.3 属性
属性 | 描述 | 值类型 | 示例 |
---|---|---|---|
id | 标识 | string | 接口标识,具有一定的接口含义如account |
basePackage | 包名称 | string | 预留字段 |
language | 语言 | String | 暂时不用 |
type | 类型 | String | client/server,接口是客户端还是由服务调用,默认为server。 如果为server,会将配置文件加载到内存中,避免反复读取文件,可提高效率 |
version | 接口版本 | string | 1.0 2.0 后续会持续使用2.0方式 |
1.2.4 规则
- 属性中id、basePackage为必配项,其他为可选项;
- 属性id必须与主接口配置文件名相同(不含后缀名);
1.2.5 示例
<interface id="gdserver" version="2.0" type="server">
<transaction id="s001">
...
</transaction>
<transaction id="s002">
...
</transaction>
</interface>
1.3 transaction
接口交易配置,接口处理的具体实现在此定义,严格意义来说一个transaction交易对应一个现实的接口,interface下可以存在多个transaction。transaction的执行流程通过step确定每一步骤的具体操作。
配置顺序:
a) step(n)
1.3.1 父节点
- interface
1.3.2 子节点
- step:定义交易的每个步骤具体的处理流程,至少一个;
1.3.3 属性
属性 | 描述 | 值类型 | 示例 |
---|---|---|---|
id | 标识 | string | 交易唯一标识transactionid |
detail | 交易执行的详细信息存储文件 | string | D:/detailinfo.log |
version | 版本号 | String | Version=”2.0” |
singleton | 是否为单例模式 | String | 默认为false。 如果配置成singleton=”true” 则表示接口为单例模式,可防止并发操作。 |
1.3.4 规则
属性id为必配项,其他为可选项。
子节点process为可配项,如果不配置process,将会根据step的顺序依次执行,如果此时存在id=exception的step,异常后会执行并结束交易,如果未发生异常那么会跳过exception的step;
1.3.5 示例
<transaction id="s001">
<process>
...
</process>
<step id="handle">
...
</step>
<step id="exception">
...
</step>
</transaction>
1.4 step
用以划分接口中的单个具体步骤,执行上没有特殊意义,但是在描述交易过程上更加直观利于理解。具体操作的执行多依靠filter、connection实现。
1.4.1 父节点
- transaction
1.4.2 子节点
- import:引用配置项;
- filter:引用预先定义的处理操作;
- connection:引用预先定义的连接操作;
- foreach:定义的是条件循环控制操作;
- while:定义的是条件循环控制操作;
- if:定义条件控制,满足条件才会执行if下的子节点;
- else:配合if一起使用,不满足if条件时,执行else下的子节点;
- elseif:配合if使用,当满足elseif的条件时,执行elseif下的子节点;
1.4.3 属性
属性 | 描述 | 值类型 | 示例 |
---|---|---|---|
id | 标识 | string | 能表达通道含义的名字如account_in |
level | 日志级别 | String | 动态设置日志级别 level=”debug” level=”info” |
1.4.4 规则
- 属性id为必配项,其他为可选项;
- step下至少会配置一个filter或者connection的具体处理。如果为空,步骤为空控步骤无意义;
- 子节点foreach配置循环条件,如果step下配置foreach节点,foreach下必须配置至少一个filter或者connection;
- 子节点if配置条件判断,如果step下配置if节点,if下必须配置至少一个filter或者connection;
- 子节点foreach、while、if、else、elseif之间支持多层嵌套使用。
1.4.5 示例
<step id="result">
<filter ref="fixedFilter" type="out">
<field tag="ccy" value="CNY" type="String" size="3" description="货币"/>
<field tag="acstatus" value="A" type="String" size="1" description="帐号状态"/>
<field tag="osbal" value="13555.63" type="number(16,2)" size="" description="账户余额"/>
<field tag="filler" value="XXXXX" type="String" size="962" description="货币"/>
</filter>
<filter ref="fileConnection" type="out">
<property name="path" value="D:/xxx.txt"/>
</filter>
</step>
1.5 connection
主要用于定义交互协议类型,定义数据接入输出的连接方式。特别说明step下的connection属于引用类型,配置与声明定义时的connection略有不同。
1.5.1 父节点
- step
- foreach
- while
- if
- else
- elseif
1.5.2 子节点
- property:连接的属性节点,可以配置连接所需要的属性参数,如配置用户名,密码,url等;
1.5.3 属性
属性 | 描述 | 值类型 | 示例 |
---|---|---|---|
ref | 引用 | string | 引用已经定义好的connection对象 |
type | 数据流向 | string | type=”in”表示接入(接收); type=”out”表示接出(发送); |
encoding | 字符集 | string | 默认为Utf-8 |
1.5.4 property属性
属性 | 描述 | 值类型 | 示例 |
---|---|---|---|
Name | 标识 | string | url: webservice发布地址 class: webservice发布的接口 method: 接口提供的方法 |
value | 值 | string | 当前字段的值; |
1.5.5 规则
- 属性ref为必配项,其他为可选项,必须正确指定到connections中的定义的connection的id属性;
- 子节点property为连接所需要的属性,如用户名密码等,如果此处配置的property与connections下定义的property的name属性相同,将会达到替换的目的;
- 需要特别注意数据流向的配置,in代表输入流,out代表输出流,针对in、out存在不同的处理;
1.5.6 示例
该实例为执行进行socket连接,通过property配置socket连接的目标ip与端口号。
<connection ref="socketClientConnection">
<property name="ip" value="127.0.0.1"/>
<property name="port" value="8888"/>
</connection>
1.6 filter
主要用于定义针对不同数据、不同连接类型的处理流程。特别说明step下的filter属于引用类型,配置与声明定义时的filter略有不同。
1.6.1 父节点
- step
- foreach
- while
- if
- else
- elseif
1.6.2 子节点
- import:引用配置项;
- field:处理操作的操作域;
- convertor:转换器;
- validator:校验器;
- foreach:定义的是条件循环控制操作;
- while:定义的是条件循环控制操作;
- if:定义条件控制,满足条件才会执行if下的子节点;
- else:配合if一起使用,不满足if条件时,执行else下的子节点;
- elseif:配合if使用,当满足elseif的条件时,执行elseif下的子节点;
- call:二次调用交易;
1.6.3 属性
属性 | 描述 | 值类型 | 示例 |
---|---|---|---|
tag | 指定filter执行结果保存 | String | |
via | 指定输入filter进行处理的变量 | String | Filter需要解析的变量 |
ref | 引用 | string | 引用已经定义好的filter对象 |
type | 数据流向 | string | type=”in” 表示数据解析; type=”out” 表示数据组装 |
encoding | 字符集 | string | 默认为utf-8 |
tag | filter作为整体的变量名 | String | |
scope | 与tag变量名对应的变量声明周期 | string | transaction:交易内 step:步骤内 this:connection与filter内 transition:当前有效 |
1.6.4 规则
- 子节点foreach、while、if、else、elseif之间支持多层嵌套使用。
- 属性ref为必配项,其他为可选项,必须正确指定到filters中的定义的filter的id属性;
- 此处引用的filter与filters中定义的filter在节点上存在明显差异,定义的filter只有parameter子节点,而此处无parameter子节点;
1.6.5 示例
该filter配置foreach子节点,会根据foreach的条件再对foreach下面的field进行处理,实例中,foreach下配置的还有if节点,只有满足if节点条件才会对if下的field进行处理,不满足则会按照else下面的field进行处理。
<filter ref="fixedFilter" type="out">
<foreach tag="j" begin="0" end="10" step="1">
<field etag="PERRP UNQ NO" value="${unqno}" type="String" size="20" description="外围系统唯一编号"/>
<if condition="${j==time-1 && j*10+j==size}">
<field etag="END FLAG" value="Y" type="String" size="1" description="财务结束标志"/>
</if>
<else>
<field etag="END FLAG" value="" type="String" size="1" description="财务结束标志"/>
</else>
</foreach>
</filter>
1.7 field
filter中处理的操作单个数据域,用于从数据报中提取填充特定位置的数据。
1.7.1 父节点
- filter
- foreach
- while
- if
- else
- elseif
1.7.2 属性
属性 | 描述 | 值类型 | 示例 |
---|---|---|---|
tag | EL表达式中的变量 | string | filter中字段的标识,作为key存入上下文; |
etag | 外部报文路径,也就是EMF模型,类似一个特殊指令 | string | 一般针对特殊的filter处理时需要配置 |
value | 值 | string | 当前字段的值; |
scope | 上下文生命周期 | string | transaction:交易内 step:步骤内 this:connection与filter内 transition:当前有效 |
type | 数据类型 | string | String Int Double Number(a,b) Date(‘pattern’) Arraylist 基本类型数组 LST(供sqlFilter特殊处理) map(HashMap) Linkedmap(有序map) |
size | 数据长度 | Int | |
codetable | 码表 | string | 平台码表id |
description | 描述 | string | field描述信息 |
1.7.3 规则
- 当filter的type为in时,一般还需配置etag与tag,当filter的type为out时,一般只需配置etag,etag针对部分特殊filter的处理而设立,其他属性为可选项;
1.7.4 示例
<field tag="len" value="${dataLen}" type="int" size="8" description="输入数据长度"/>
1.8 convertor
filter中处理的操作单个数据域,用于从数据报中提取填充特定位置的数据。
1.8.1 父节点
- filter
- foreach
- while
- if
- else
- elseif
1.8.2 属性
属性 | 描述 | 值类型 | 示例 |
---|---|---|---|
tag | EL表达式中的变量 | string | filter中字段的标识,作为key存入上下文; |
value | 值 | string | 当前字段的值; |
1.8.3 规则
- convertor不参与Filter中filed组装。convertor实际可用filed节点进行替代。
1.8.4 示例
<filter tag="msg" type="out" ref="fixedFilter" encoding="GBK">
<convertor tag="dataLen" value="${getLen}">
<argrument description="this" value="${msg}"/>
</convertor>
<field value="z02" type="String" size="3"/>
<field value="3888" type="String" size="4"/>
<field value="${msg}" type="String" size="${dataLen}"/>
</filter>