ABAP/Java PROXY 同步调用 and 异步调用(转)
原文链接:http://blog.sina.com.cn/s/blog_c0978c9b0102va9z.html
一:同步调用
Proxy分为两种,ABAP Proxy和JAVA Proxy。他们之间的不同不仅在于语言,ABAP Proxy在应用端(R/3等)生成的,JAVAProxy是从IR中生成的.JAR文件。但是它们都是依据message interface中的WSDL产生的。
Proxy具有与message interface相同的属性:Inbound, Outbound, Synchronous, Asynchronous
做ABAP Proxy之前,要用 RZ70去建立R/3与PI的连接。这里还可能需要用SM59去定义相应的RFC Destination。用SMGW可以在PI的端找到相应的Service。
Table:SPROXSET,是用来设置SPROXY权限的,可以查找在这张表里查找自己是不是有权限。
T-CODE:SPROXY就是在Application端生成PROXY的主要工具,在这之前,你需要在PI端设置好相应的Message Interface,SAP端才能根据Message Interface的WSDL生成ABAP Proxy。
JAVAProxy相对简单,只要在Message Interface中右击相应的Message Interface,会有Java Proxy Generation选项,就可以自动生成JAVAProxy,.JAR文件,开发人员可以对其进行部署。
这里我不再对proxy做介绍,只是讲调用过程。
首先创建了功能函数,没必要是rfc。(当然,可以在proxy代理类内直接写功能代码,不推荐)
比如:创建外向交货单的fm: ZFM_IF_OUT_DELIVERY_CREATE_SLS
然后进入proxy创建代理
t-code:sproxy
进入如下初始:
大概的层级如下:

到 点开 service interfaces,
中文是
找到对应的代理(接口那边会告诉你具体名称),未生成的代理和已经生成的,图标是不一样的。

找到需要生成的代理,双击,提示如下界面,然后按要求填上就行了
然后保存,然后激活。会提示如下:
这个时候双击proxy的 class,不是proxy name。
如果双击class提示什么不存在,说明没激活,全部激活就可以了
尽到类里面,双击method就行了。然后里面写代码。
在里面实现功能代码即可

最后保存,激活即可。
如果接口有任何变动,记得激活后重新生成代理
或者:

这里需要注意的是参数,
传入参数,都是string类型的
然后需要根据名称,转换为咱们需要的类型,然后再去调用接口函数。
最后把返回结果转为string。再赋给代理
这是同步的,比较简单
二:异步调用
同步调用的时候,都行选的后缀是in的代理
比如:
后最是out的,是异步调用的。
到这里以后,同样是双击,创建,弹出界面也一样,然后保存,保存后激活。
然后这里,发现没有同步时的那个proxy class、
这里直接双击proxy name即可
然后双击out的方法
会跳到如下界面,代码是自动生成的,不用处理
全部激活就行了
如果接口有改动,记得重新生成。
异步的,不像同步,执行完了就直接返回了
需要写代码执行。
大部分代码是固定的。
FORM frm_call_proxy TABLES pt_data STRUCTURE zsdslh0515. ***&调用代理返回日志 ***&执行ABAP PROXY返回EC5.0日志信息 DATA: ls_output TYPE zfmmm_qth_if00020_input, lt_zmroskjxylogl TYPE zmmshg00520_tab. DATA: ls_proxy TYPE REF TO zco_si_djz_hg_erp_rph_data_a_o, ls_sys_exception TYPE REF TO cx_ai_system_fault, lv_subrc TYPE sy-subrc, lv_errlog TYPE string. ***&给返回代理赋值 CLEAR ls_output. REFRESH lt_zmroskjxylogl. CALL FUNCTION 'ZFM_CA_STRING_TB_STRUCT'“这里是自己封装的一个函数,把结构里字段转为string EXPORTING iv_type = '2' TABLES it_data = pt_data """"""""" et_data = lt_zmroskjxylogl. IF NOT lt_zmroskjxylogl[] IS INITIAL. ls_output-it_zmmthg00520-item = lt_zmroskjxylogl. ENDIF. **&调用反馈代理 IF ls_output IS NOT INITIAL. TRY. CREATE OBJECT ls_proxy . "端口 CATCH cx_ai_system_fault INTO ls_sys_exception. lv_subrc = '4'. lv_errlog = ls_sys_exception->get_text( ). CATCH cx_ai_application_fault. lv_subrc = 4. ENDTRY. IF lv_subrc <> '4'. "传输数据 TRY. CALL METHOD ls_proxy->si_djz_hg_erp_rph_data_a_out ”代理名称 EXPORTING output = ls_output. CATCH cx_ai_system_fault INTO ls_sys_exception. lv_subrc = '4'. lv_errlog = ls_sys_exception->get_text( ). CATCH cx_ai_application_fault. lv_subrc = 4. ENDTRY. ENDIF. ENDIF. ENDFORM. " FRM_CALL_PROXY
每天学习一个知识点,累积就是财富。