普通报文和定长报文

多系统之间,通过TCP交互,那么报文在这其中起到了异常关键的作用,对于报文,有一些很零碎的小小的心得,在此做一下分享(代码中没太注意大小写书写)。

一、普通报文

a.  在标签中可以加“xmlns”类似于网址的东西(其实具体有什么卵用我还真不知道,目前所有的拼接都是为了格式严谨),放在xmlAttributes属性中,格式如下:

xmlAttributes="xmlns:xsi={'网址1'} xmlns={‘网址2’}” 这是一种写死的格式,灵活的可以将所需网址在java类中塞入context中,然后在报文中用键值对来替换这些死值。

b. 报文所在包下,都会有一个*Packet*.xml文件(公司习惯性写法,完全可根据喜好自定义),第一个*可以定义outbound和inbound,用来让读者清晰了解我们此系统是作为接收方还是作为发起方,第二个*一般可以根据需求或喜好添加“Res”、“Req”等后缀

c. 报文文件中都会定义version、编码

d. <Group>标签中的Name和tagName一样,没有优先级,根据定义的先后拼接不同的标签名称(常用语Map中套Map套Map...只需不断设置标签的值就OK)

f. 在<Group>标签中可以设置includePrefix属性,功能时定义报文文件名称手写名称,框架中默认封装成了fseg(在XmlSegment.java中封装)。

g.报文的body会定义在<segment>中,格式如下:

<Segment>

<xmlTag tagName="①">                                                     PS:①中定义的是展示在控制台下的字段名称,②中定义的是系统中传入的字段。Type一般为String类型

<Type name="②"></Type>                    

<xmlTag>

</Segment>

h. 报文中需要的字段,只要在context中塞入,那么在对应的xml中配置好相应的报文,则一定有值。

i. 若从数据库中一次查出多条数据,要用"queryForList",并用List来接收,报文配置格式如下:

<Segment>

<xmlTag tagName="①">                                                     

<idxField name="②"> 

<Group tagName="Map">

<xmlTag tagName="③">                                                    

<Type name="④"> </Type>                    

<xmlTag>

</Group>

</idxField>     

<xmlTag>

</Segment>

PS:①表示展示展示在控制台上的字段名称,可自定义。

 ②表示从java类中查询到的并插入到context中的数据,要前后一致,不可自定义。

 Map同①一样,为在控制台显示数据,可自定义

 ③同①一样,为在控制台显示数据,可自定义

 ④为真实数据属性,从后台传入,需保持前后一致

二、定长报文

背景:与核心通信时,因为业务要求,为了配合核心,需要传入固定长度的报文,不可长也不可短,简单些说这就是定长报文,按如下配置:

在spring中对报文的引用,都会有Inbound/outboundPacket*xml这样的文件,普通报文中再这里进行的是<Head>报文头的配置,和<Body>的拼接,而定长报文需按如下配置先配置定长的报文头:

<outboundPacket formatPrefix="f" nameOfbodylength = "BodyLegth">

<Segment>

<fixNumber name="BodyLength" length="8" />

<fixString name="BodyLength" length="4" />

</Segment>

<include include="body"></include>

</outboundPacket>

PS: 1.formatPrefix+include指定了接下来需要解析的xml文件,如本例中即为:fbody.xml

2.在fbody.xml中配置的只要按以前普通报文的<Head>和<Body>形式即可,即可以根据业务不断用include往下连接,也可以直接写在fbody.xml中,看实际情况。

3.对于定长限制,长度可以大。对数字类型的大了就在前面用“0”占位,若字符串类型的大了就在后面用空格补齐,但是长度不可以比实际的小,否则会报错。

4.若在xml报文中需要换行,不能直接向context中塞入“/r/n”,应按如下格式写:

java类中:map.put("CRLF","0x0D0A");   //16进制写法

   context.setDataMap(map);

xml报文中:

    <fixBinaryNumber name="CRLF" length="2">

猜你喜欢

转载自blog.csdn.net/weixin_41167961/article/details/82589392
今日推荐