登陆PO服务器,启动JAVA客户端三步(SAP PO 开发一)
搭建一个WebService接口环境(SAP PO 开发 二)
用SAP PO连通一个WebService接口(SAP PO 开发 三)
ERP系统RFC协议发送端通过PO连通WebService接口(SAP PO 开发四)
我的第一个SAP PROXY ABAP Program(SAP PO 开发五)
SAP PO (Process Orchestration) 中间件接口管理平台(SAP PO 开发六)
C# 调用SAP PO中间件的WebService接口(SAP PO 开发八)
SAP PO 开发系列接近尾声,当然最后还需要一个压轴大戏DEMO006:PROXY2SOAP。
这次我们要使用久违的PROXY,通过使用PROXY我们才知道SAP 接口开发中RFC和PROXY的本质区别,
而网上那篇SAP IDOC、RFC、PROXY协议比较的表格终归讲得太浅。
一、DEMO006的场景:
SAP HCM系统中通过PROXY方式传出一个数据给PO,PO把这个数据传给一个WebService。
WebService收到数据后,把数据放到一段文本中返回PO,PO再返回到SAP HCM系统中。
二、DEMO006在PO上SLD的配置内容:
三、打开PO的Enterprise Services Builder配置:
1、同SAP HCM相关的接口内容DT、MT、SI:
发出变量定义int
收到返回的字符串
向上封装成MT
带出SI
2、同WebSerivce相关的接口内容DT、MT、SI:
因为WS是有接口描述文件xsdl的,我们就偷懒不用创建DT、MT了。
直接用xsdl创建ED,ED再创建SI就好。
创建MM的请求和返回
创建OM
四、打开PO的Integration Builder配置:
建一个demo006集成环境,空的就行。
建一个CC通道,注意看协议是基于HTTP的XI3.0,
说明SAP ABAP端是把数据封装到基于HTTP的XI协议发给PO的:
建一个CC通道,在WebService这边,注意看协议是标准的WS的SOAP协议:
最后建IC的1~4页签:
PO端配置完成。
五、在SAP服务器的ABAP环境中作一个proxy程序
SPROXY事务代码中,可以看到已经有了DEMO006
在Service_Consumers中,点SI_demo006_sender,创建一个proxy:
这个proxy的参数,我们看到有MT:
点一个MT进去,里面还有一个DT类型,这些都是SAP根据PO创建的数据结构自己创建的。
DT里面有我们的一个变量:
写一个ABAP程序,调用这个proxy接口:
DATA LO_PROXY TYPE REF TO ZPOCO_SI_DEMO006_SENDER.
DATA Z1 TYPE ZPOMT_DEMO006_RESPONE.
DATA Z2 TYPE ZPOMT_DEMO006_REQUEST.
Z2-MT_DEMO006_REQUEST-ZVALUE = 3.
CREATE OBJECT LO_PROXY.
TRY.
CATCH CX_AI_SYSTEM_FAULT.
ENDTRY.
TRY.
LO_PROXY->SI_DEMO006_SENDER(
EXPORTING
OUTPUT = Z2
IMPORTING
INPUT = Z1
).
CATCH CX_ROOT INTO DATA(LCX_ERROR).
DATA(ERR_TEXT) = LCX_ERROR->GET_TEXT( ). "得到错误信息
ENDTRY.
WRITE:/ ERR_TEXT.
WRITE:/ Z1-MT_DEMO006_RESPONE-ZRETURN.
运行程序,得到WS的返回文本:
SAP RFC协议工作在SOCKET底层,它的使用环境是ABAP,C#的NCO、JAVA的JCO类库。
SAP PROXY的XI协议,工作在上面的HTTP层,它的环境是借助PI、PO系统提供上层的基于SOAP的服务。
我想这是RFC和PROXY的本质区别。
既然DEMO007是RFC的,DEMO006是PROXY的,他们都是发给同一个WS接口,那我们就来作一个性能测试:
对同一个WS接口,发收数据100次,我们看看他们的时间差别:
我想,PROXY的耗时主要用在对HTTP协议转换上了。
--------------2019-6-3-------------------------------------------------
我一直在思考一个问题,如果RFC工作在底层,它的效率最高,那为什么SAP还会推出PROXY,
而且从SAP项目选择来看,SAP-RFC的接口技术正在被PROXY所取代。
随做对PROXY认识的加深,我终于明白了。
单纯的比较性能,肯定是RFC工作在底层,RFC最厉害。
但要实现RFC有很多前提:
1、需要外围系统使用RFC的类库编程,这个虽然很简单,但是并不被大量的开发工程师所掌握。
2、除了外围系统,SAP系统使用RFC,需要在系统内定义自己表的结构,这个工作虽然也简单,但是它还是需要人天。
3、使用RFC,是2份工作要协同:SAP系统内ABAP工作,外围系统NCO、JCO工作大家要一起调试。
而PROXY呢:
1、PO顾问会按外围系统的WebService接口描述wsdl,导入PO中,创建接口DateType数据定义,然后啪啪配置一番联通。
2、SAP系统中是带入PO的数据定义,不用自己创建,然后ABAP代码直接调用。
3、基本不需要2个系统的调试,这个主动权会掌握在PO集成开发顾问这里。
RFC和PROXY的差别也体现在工作量上,PROXY的工作量会远远小于使用RFC。
下面是2段公平的测试程序代码:
*&---------------------------------------------------------------------*
*& Report ZDEMO007
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZDEMO007.
DATA GV_VALUE TYPE /BCV/FND_INT1.
DATA GV_GETDATARESULT TYPE /ASU/TEXT.
*请按系统实际情况填写如下信息
WRITE: /'****************************'.
WRITE: / 'SAP系统: RFC'.
WRITE: /'****************************'.
WRITE: /.
DATA: T1 TYPE I,
T2 TYPE I,
T TYPE P DECIMALS 0.
DATA: GV_C(6) TYPE C .
DATA N TYPE I VALUE 100.
DATA ALL TYPE I.
DATA TMP TYPE I.
T = 0.
GET RUN TIME FIELD T1.
DO N TIMES.
*****************************
* Code to be tested *
*****************************
GV_VALUE = 9.
CALL FUNCTION 'ZDEMO007' DESTINATION 'ZDEMO007'
EXPORTING
VALUE = GV_VALUE
IMPORTING
GETDATARESULT = GV_GETDATARESULT .
ENDDO.
GET RUN TIME FIELD T2.
T = ( T2 - T1 ) / 1000000.
GV_C = T.
CONDENSE GV_C NO-GAPS.
WRITE: /'耗时:' , GV_C , '秒'.
===============
*&---------------------------------------------------------------------*
*& Report ZDEMO006
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZDEMO006.
DATA LO_PROXY TYPE REF TO ZPOCO_SI_DEMO006_SENDER.
DATA Z1 TYPE ZPOMT_DEMO006_RESPONE.
DATA Z2 TYPE ZPOMT_DEMO006_REQUEST.
*请按系统实际情况填写如下信息
WRITE: /'****************************'.
WRITE: / 'SAP系统: PROXY'.
WRITE: /'****************************'.
WRITE: /.
DATA: T1 TYPE I,
T2 TYPE I,
T TYPE P DECIMALS 0.
DATA: GV_C(6) TYPE C .
DATA N TYPE I VALUE 100.
DATA ALL TYPE I.
DATA TMP TYPE I.
T = 0.
Z2-MT_DEMO006_REQUEST-ZVALUE = 3.
CREATE OBJECT LO_PROXY.
TRY.
CATCH CX_AI_SYSTEM_FAULT.
ENDTRY.
GET RUN TIME FIELD T1.
DO N TIMES.
* TRY .
LO_PROXY->SI_DEMO006_SENDER(
EXPORTING
OUTPUT = Z2
IMPORTING
INPUT = Z1
).
* CATCH CX_ROOT INTO DATA(LCX_ERROR).
* DATA(ERR_TEXT) = LCX_ERROR->GET_TEXT( ). "得到错误信息
* ENDTRY.
ENDDO.
GET RUN TIME FIELD T2.
T = ( T2 - T1 ) / 1000000.
GV_C = T.
CONDENSE GV_C NO-GAPS.
WRITE: /'耗时:' , GV_C , '秒'.
*WRITE:/ ERR_TEXT.
* WRITE:/ Z1-MT_DEMO006_RESPONE-ZRETURN.