0
点赞
收藏
分享

微信扫一扫

Biz-SIP业务中台案例实战(13)——Source调用格式转换器Converter

Biz-SIP业务中台支持多种报文类型的格式转换器(Converter),包括XML、JSON、定长、有分隔符、ISO-8583等报文类型的解包和打包。
在Source模块中,可以通过Java API接口调用Converter,在Source模块代码中实现报文解包和打包。
本节案例中是在通过RestController接入的Source模块代码中,通过Java API调用模板XML格式转换器(simple-xml),实现XML报文的打包和解包:
在这里插入图片描述

SampleSource4Controller是一个RestController,通过RESTful接受XML报文请求后,通过调用格式转换器Converter进行报文解包成平台标准JSON报文,然后调用App服务。
App服务(/bean/sample1)对输入报文没有做任何修改,是直接把原报文返回的。
SampleSource4Controller在收到App服务返回报文后,会再调用格式转换器进行报文打包成XML报文,作为RESTful请求的响应返回。

一、Source层Source服务的开发和配置

首先,在Biz-SIP配置目录的source.yml中,配置对应的Source:

- id: source4
  converter:
    type: simple-xml

可以看到source4这个Source,格式转换器converter,设置为“type: simple-xml”,表示是采用基于简单XML格式转换器。
SampleSource4Controller是一个RestController,负责外部调用的接入,相关代码如下:

@Slf4j
@RestController
public class SampleSource4Controller {
    private Converter converter = Converter.getSourceConverter("source4");
    private BizMessageInterface appInterface = SourceClientFactory
            .getAppServiceClient(BizMessageInterface.class,"/bean/sample1");

    @PostMapping(value = "/source4", consumes = "application/xml", produces = "application/xml")
    public Object doService(@RequestBody String inMessage, HttpServletResponse response) {
        BizMessage outMessage = null;
        try {
            JSONObject jsonObject = this.converter.unpack(inMessage.getBytes());
            log.debug("解包后消息:\n{}", BizUtils.buildJsonLog(jsonObject));
            BizMessage<JSONObject> bizMessage = this.appInterface.call(jsonObject);
            log.debug("调用服务返回消息:\n{}",BizUtils.buildBizMessageLog(bizMessage));
            byte[] outData = this.converter.pack(bizMessage.getData());
            log.debug("打包后消息:\n{}",BizUtils.buildHexLog(outData));
            return new String(outData);
        } catch (BizException e) {
            return "Source API执行出错:"
                    + "\ncode:" + e.getCode()
                    + "\nmessage:" + e.getMessage()
                    + "\nextMessage:" + e.getExtMessage();
        }
    }
}

可以看到SampleSource4Controller类实现了“/source4”的URL接口,申明了和source.yml中的source4所绑定的格式转换器——converter,以及调用“/bean/sample1”App服务的调用接口——appInterface。在doService()方法中,主要有以下处理步骤:

  1. 调用this.converter.unpack(),对传入的XML报文进行解包;
  2. 把打包后的XML报文,通过this.appInterface.call()方法调用App服务;
  3. 调用this.converter.pack(),把调用App服务返回的报文打包成XML报文返回。

二、App层App服务的开发和配置

App服务,是采用《Biz-SIP业务中台案例实战(1)——开发最简单的App服务》一节中介绍的“/bean/sample1”,这个App服务是收到请求后,不做任何处理,直接把请求返回。具体的app.yml配置和相关的Sample1AppService类代码,这里就不再细述,具体参考前面的介绍。

三、启动应用进行测试

启动SampleSourceApplication、SampleAppApplication应用,通过curl发起测试报文:

$ curl -H "Content-Type:application/xml" -X POST --data '<?xml version="1.0" encoding="UTF-8" standalone="no"?><root><accountName>王五</accountName><balance>500</balance><accountNo>005</accountNo></root>' http://localhost:8080/source4

<?xml version="1.0" encoding="UTF-8" standalone="no"?><root><accountName>王五</accountName><balance>500</balance><accountNo>005</accountNo></root>shizhengyedeMacBoo

SampleSourceApplication应用打印日志:

[bizsip-sample-source:192.169.1.107:8080] 12:54:52 DEBUG 8409 [] [http-nio-8080-exec-1] c.b.b.s.s.c.SampleSource4Controller      解包后消息:
{
    "accountName": "王五",
    "balance": 500,
    "accountNo": "005"
}
[bizsip-sample-source:192.169.1.107:8080] 12:54:52 DEBUG 8409 [] [http-nio-8080-exec-1] c.b.b.source.api.AppServiceClientMethod  调用App服务: /bean/sample1
[bizsip-sample-source:192.169.1.107:8080] 12:54:52 TRACE 8409 [] [http-nio-8080-exec-1] c.b.b.source.api.AppServiceClientMethod  调用App服务请求报文:
{
    "accountName": "王五",
    "balance": 500,
    "accountNo": "005"
}
[bizsip-sample-source:192.169.1.107:8080] 12:54:53 DEBUG 8409 [] [nioEventLoopGroup-2-1] c.b.b.s.s.l.NettyClientHandler           写空闲超时,发送心跳检测包!
[bizsip-sample-source:192.169.1.107:8080] 12:54:53 TRACE 8409 [e1fd243478df4f119d6c3cfa5f615671] [http-nio-8080-exec-1] c.b.b.source.api.AppServiceClientMethod  App服务响应报文:
traceId: e1fd243478df4f119d6c3cfa5f615671
appServiceId: /bean/sample1
code: 0
message: success
{
    "accountName": "王五",
    "balance": 500,
    "accountNo": "005"
}
[bizsip-sample-source:192.169.1.107:8080] 12:54:53 DEBUG 8409 [e1fd243478df4f119d6c3cfa5f615671] [http-nio-8080-exec-1] c.b.b.s.s.c.SampleSource4Controller      调用服务返回消息:
traceId: e1fd243478df4f119d6c3cfa5f615671
appServiceId: /bean/sample1
code: 0
message: success
{
    "accountName": "王五",
    "balance": 500,
    "accountNo": "005"
}
[bizsip-sample-source:192.169.1.107:8080] 12:54:53 DEBUG 8409 [e1fd243478df4f119d6c3cfa5f615671] [http-nio-8080-exec-1] c.b.b.s.s.c.SampleSource4Controller      打包后消息:
====+ 01-02-03-04-05-06-07-08-09-10-11-12-13-14-15-16-17-18-19-20 + ====== ASCII  ====== +
0000: 3C 3F 78 6D 6C 20 76 65 72 73 69 6F 6E 3D 22 31 2E 30 22 20 | <?xml version="1.0"  |
0020: 65 6E 63 6F 64 69 6E 67 3D 22 55 54 46 2D 38 22 20 73 74 61 | encoding="UTF-8" sta |
0040: 6E 64 61 6C 6F 6E 65 3D 22 6E 6F 22 3F 3E 3C 72 6F 6F 74 3E | ndalone="no"?><root> |
0060: 3C 61 63 63 6F 75 6E 74 4E 61 6D 65 3E E7 8E 8B E4 BA 94 3C | <accountName>王.五.< |
0080: 2F 61 63 63 6F 75 6E 74 4E 61 6D 65 3E 3C 62 61 6C 61 6E 63 | /accountName><balanc |
0100: 65 3E 35 30 30 3C 2F 62 61 6C 61 6E 63 65 3E 3C 61 63 63 6F | e>500</balance><acco |
0120: 75 6E 74 4E 6F 3E 30 30 35 3C 2F 61 63 63 6F 75 6E 74 4E 6F | untNo>005</accountNo |
0140: 3E 3C 2F 72 6F 6F 74 3E                                     | ></root>............ |
举报

相关推荐

0 条评论