抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

前面写了CPI接口的发布、异常处理和日志跟踪等内容,但是在实际开发过程中我们还需要配置一些异步调用的CPI接口。而CPI的异步接口功能十分强大,当消息处理失败时并不会记录一个日志之后就停止了。而是会在记录日志之后将失败的消息再次填充进队列中重复执行。当执行到一定的次数还是失败的话才会停止执行。在每次重处理消息时也会同步更新日志记录的结果,直到执行成功为止。

虽然CPI的异步功能强大且方便,但是其配置却十分简单,和发布一个普通的CPI接口只相差两个步骤。下面对异步的接口发布做一篇记录的笔记。

异步CPI接口配置

一、SAP端接口介绍

配置CPI的异步接口前需要在SAP端先发布一个Web Service接口获取到SAP端接口的WSDL地址。因为发布Web Service接口之前在《通过Web Service发布CPI接口》这篇笔记中做过介绍,且本篇主要介绍CPI的异步配置。所以就不再介绍如何配置一个Web Service的接口了。

1.SAP端接口逻辑

本次使用的SAP接口是:YSFLIGHT_DEMO_01。接口的逻辑如下图所示。

1.SAP端接口逻辑截图

2.接口企业服务

由上面的接口配置的企业服务如下图所示。

2.SAP企业服务截图

3.接口WSDL地址

通过事务代码SOAMANAGER打开接口的Web Service配置。查看接口的WSDL地址。

3.SAP接口WSDL地址内容截图

二、CPI端异步配置

1.新建iFlow

进入存放CPI接口的Package,然后点击图中的添加 –> Integration Flow

4.CPI创建IFlow接口_创建按钮

在其中填写接口的名称、标识与描述内容,然后点击右下角的添加并在编辑器中打开

5.CPI创建IFlow_名称与描述

2.创建集成过程

进入编辑界面后,虽然已经有一个集成过程组件了。但是异步的接口需要额外的一个集成过程做处理。其实可以理解成异步是一个接口,而处理异步队列消息的集成过程是另一个接口。并且这两个集成过程是可以分成两个单独的iFlow的(这个后面截图简单介绍下)。

6.添加集成过程与消息对象

3.创建JMS异步队列

接下来创建的HTTP适配器与JMC异步队列适配器是该接口的入口。其他系统在调用该接口时,会将请求存储到JMC的队列中。然后再通过JMC队列调用SAP的接口。

7.添加JMC容器对象

设置JMC适配器对象时有其他的几个属性,起作用和说明如下所示。

  • Queue Name:消息队列名称
  • **Retention Threshold for Alerting (in d)**:警报的保留阈值(单位:天)
  • **Expiration Period (in d)**:有效期(单位:天)
  • Compress Stored Message:压缩存储的消息
  • Encrypt Stored Message:加密存储的邮件
  • Transfer Exchange Properties:传输Exchange属性

4.添加日志记录脚本_Request01

和其他接口设置日志记录脚本一样,此处通过脚本记录日志文件。

8.添加JMC的日志记录脚本
1
2
3
4
5
6
7
8
def Message processData(Message message) {
def body = message.getBody(java.lang.String)
def messageLog = messageLogFactory.getMessageLog(message)
if (messageLog != null) {
messageLog.addAttachmentAsString('Request01', body, 'text/plain')
}
return message
}

5.设置接口传入JMS

接下来设置的就是接口的处理流程逻辑了,但其实也就是和发布一个普通的接口是一样的。只不过以前传入的适配器对象是HTTPS的适配器,现在因为HTTPS适配器已经将请求全部存储在JMS队列中了。所以在设置传入适配器选项时要将原来的HTTPS适配器修改为JMS适配器并填上JMS的适配器名称。

9.设置传入的JMS适配器
  • Queue Name:JMS队列名称
  • Number of Concurrent Processes:并发进程数
  • **Retry Interval (in min)**:重试时间间隔(单位:分钟)
  • Exponential Backoff:如果选中,则每次重试不成功后,重试间隔将加倍。
  • **Maximum Retry Interval (in min)**:最大重试间隔(单位:分钟)
  • Dead-Letter Queue:如果两次重试后无法处理邮件,请选中此复选框将其放入死信队列。

6.添加消息修正符

本次还是使用的动态字段匹配方式,所以需要使用内容修正符在外层追加部分类似于命名空间的东西。

10.添加消息修正符

7.添加日志记录脚本_Request_XML

此处添加的日志记录脚本是正式接口流程中的脚本记录文件,在监控器中会将每个集成流单独识别为一个接口然后单独有一个日志记录的数据。所以此处可以理解为是一个新接口了,所以脚本的文件名为Request_XML。此处的XML没有什么意义,只是手误写成了XML。

此处可以考虑直接复制下面集成过程中的日志记录脚本然后直接在这里引用即可。因为他的JS代码上面已经标注过了,所以此处就不再展示代码了。

11.添加日志记录脚本_Request01

8.添加格式转换器 JSON TO XML

(1)设置转换器属性

进行完成上面的操作之后就可以将JSON形式的报文转换为XML形式的报文然后传递到SAP进行请求处理了。

12.添加格式转换器_JSON_TO_XML

在命名空间映射处填写的内容如下:

JSON Prefix XML Namespace
urn urn:sap-com:document:sap:rfc:functions
soapenv http://schemas.xmlsoap.org/soap/envelope/

动态映射SAP字段与外围系统报文的方式。这种方式有如下特征:

  • 报文的字段名和SAP的参数名称完全一致,并且字段名必须全部大写(如果传递的报文有小写字段名会映射不到值);
  • 当SAP端参数结构发生变化时,只需要在SAP GUI中的企业服务端右键对应的企业服务对象使用“一致性检查”即可;
  • CPI需要在最终的报文外层另包一层用来指向SAP端哪一个RFC的指向,参考内容修正符中Message Body中的内容。

(2)配置接口运行时配置

设置完上面的命名空间映射后,还需要配置SAP接口整体的运行时配置。双击界面中的空白位置唤出配置界面。

1
xmlns:urn=urn:sap-com:document:sap:soap:functions:mc-style;xmlns:n0=urn:sap-com:document:sap:rfc:functions
13.设置接口运行时配置

9.添加日志记录脚本_Request02

添加日志记录脚本,记录经过JSON TO XML转换后的XML数据。便于后期排查问题。

14.添加日志记录脚本_Request02
1
2
3
4
5
6
7
8
def Message processData(Message message) {
def body = message.getBody(java.lang.String)
def messageLog = messageLogFactory.getMessageLog(message)
if (messageLog != null) {
messageLog.addAttachmentAsString('Request_XML', body, 'text/plain')
}
return message
}

10.添加请求回复

将消息处理完成之后就可以添加请求回复组件调用接口了。

15.添加请求回复

这里的各项属性参数与意义在《通过Web-Service发布CPI接口》中记录的很清楚了(例如Location ID从哪里获取、Credential Name的创建方式等)。所以这里就只介绍下参数的含义即可。详细的可以参考《通过Web-Service发布CPI接口》。

  • Address:调用的接口地址
  • Proxy Type:指定使用的代理类型。
    • On-Premise:本地部署
    • Internet:网络部署
  • Location ID:BTP上配置的SAP服务器名称
  • URL to WSDL:定义WS提供程序终结点的WSDL的URL
  • service:引用的WSDL中包含的选定服务的名称
  • Endpoint:引用的WSDL中包含的选定服务(在“服务名称”字段中提供)的选定端点的名称
  • Operation Name:引用的WSDL中所选服务的操作名称
  • Authentication:接口调用的权限认证方式
  • Credential Name:可理解成调用接口时连接对方系统的账号
  • **Timeout (in ms)**:接口的请求等待时长,单位为毫秒,默认为60秒一分钟时间。
  • Keep-Alive:选择向服务器发送信号,表示即使在初始请求/响应序列结束后,客户机仍希望保持连接的开放。一旦建立连接,直到服务器或客户端关闭才会断开。如果未选择Keep-Alive,则在每个请求/响应序列之后自动关闭连接
  • Compress Message: 启用此WS端点以:向WS提供程序发送压缩的请求消息向WS提供器指示它可以处理压缩的响应消息。
  • Allow Chunking:选择此选项可以在发送消息时允许HTTP数据块。
  • Return HTTP Response Code as Header:选择此选项可将HTTP响应代码设置到标头CamelHttpResponseCode中。
  • Clean-up Request Headers:选择此选项可在接收方调用后清除适配器特定的标头。

11.添加日志记录脚本_Response01

调用完成接口后添加一个记录接口返回值的日志记录脚本。

16.添加日志记录脚本_Response01
1
2
3
4
5
6
7
8
def Message processData(Message message) {
def body = message.getBody(java.lang.String)
def messageLog = messageLogFactory.getMessageLog(message)
if (messageLog != null) {
messageLog.addAttachmentAsString('Response01', body, 'text/plain')
}
return message
}

12.添加格式转换器 XML TO JSON

因为对方系统是需要JSON形式的返回报文的,所以这里需要将从SAP出来的XML形式报文转换为JSON形式的报文。

17.添加XML TO JSON转换器

此处设置在XML Element里面的设置是用来设置返回报文中的JSON数组的。当在这里声明接口后,返回的JSON报文就会将同名的接口转换为JSON数组的形式。

13.添加日志记录脚本_Response02

最后再添加一个记录最后传递出去的返回值报文。

18.添加日志记录脚本_Response02
1
2
3
4
5
6
7
8
def Message processData(Message message) {
def body = message.getBody(java.lang.String)
def messageLog = messageLogFactory.getMessageLog(message)
if (messageLog != null) {
messageLog.addAttachmentAsString('Response02', body, 'text/plain')
}
return message
}

14.发布接口

进行完成上面的操作后点击右上角的部署按钮,发布接口。之后的流程和普通的接口处理过程一致。拿到接口的地址,然后提供给对端系统即可。

19.发布接口 获取接口地址

三、接口测试

1.使用POSTMAN测试接口

打开Postman软件填入上面的接口地址,然后设置权限控制类型为Basic Auth。

20.Postman设置权限

2.传输请求

使用下图所示的报文发送数据。

21.发送报文

3.查看日志监控器

首先可以看到我们只发送了一条请求,但是在监控器中却有两条记录。这是因为这个接口有两个集成过程。而监控器记录的过程中会先记录一次外围系统调用的记录,然后再记录CPI调用SAP的记录。所以才会有两条记录。

较早的这一条记录就是对端系统调用CPI时将请求存入JMS队列的记录。和我们在JMS流程中只添加了一个日志记录脚本相对应,只有一个附件。

22.日志记录结果1

日志来源:

23.日志来源说明

接下来看较晚的这一条记录。可以看到它有四条记录,分别是两条Request和两条Response。他就是CPI调用SAP时的流程了。

24.日志记录结果2

日志来源:

25.日志来源说明2

以上就是CPI的异步流程。其实和发布一个SAP的接口基本一致,只是在开始时将传入接口的HTTPS适配器换成了JMS适配器而已。其他的操作和流程都是一样的。

评论