SAP RFC通讯模式

      在网络技术中,数据通讯能够大体划分为两种基本模式:同步通讯异步通讯数据库

      其本义是:异步通讯时,通讯双方时钟容许存在必定偏差;同步通讯时,双方时钟的容许偏差较小。在SAP的系统间的通讯过程当中,也借用术语同步通讯和异步通讯,但其主要差别在于调用系统是否须要当即接受返回结果。这两种通讯模式各有局限性,不一样的应用适用于不一样的通讯模式。安全

      SAP中的同步通讯是一次性的功能调用,其前提条件是在调用远程功能时(或发送请求时),接受系统(服务器)必须是活动的,能够接受请求并进行进一步的处理(图一)。同步调用的优势是能够即时将数据返还给发送系统;其缺点为在系统对话时必须确保两个系统都处于活动的状态,不然对话会出现严重中断,影响业务应用的处理过程。例如,在本地系统中建立一个采购订单,可是在保存该采购订单以前,须要远程访问中心财会系统,以进行预算检查。这个过程要求即时的检查结果,于是须要经过同步调用实现。若是中心财会系统暂时不可用,那么采购订单也将没法建立。服务器


图一 SAP中的同步通讯网络

      SAP中的异步通讯的特色是接收系统并不须要在远程功能调用时处于激活状态,该系统能够滞后接收并处理该调用(图二)。若是系统部可用,已发送的请求将保存在发送系统的输出队列中,并每隔一段时间反复进行调用尝试,直到接收系统对调用响应为止。异步通讯的优势是不须要接收系统随时可用,如系统维护、升级等状况均不影响请求发送系统的业务处理;但该模式不适用于要求即时响应的处理过程。例如,在系统中向外部供应商发出一个采购订单,若是该供应商的系统暂时不可用,则该订单暂时置于发送的请求队列,每隔一段时间从新发送,直到供应商收到该订单为止。这一过程能够之后台做业形式完成。app

                                                                                             

图二 SAP中的异步通讯异步

以上述两种基本通讯模式为基础,SAP系统中的RFC过程扩展为如下几种不一样的模式。async

1. 同步RFC函数

同步RFC(sRFC,synchronous RFC)是RFC的最原始版本,其执行基于同步通讯模式,远程调用时,通讯双方的系统必须都可用,调用程序等待远程功能处理结束并返回结果。性能

     可使用命令 CALL FUNCTION 函数的名字DESCTINATION 目的地。调用远程的ABAP 函数模块。当以这种方式调用一个函数时老是应该包括对标准异常OMMUNICATION_FAILURE 和 SYSTEM_FAILURE 的处理。测试

2. 异步RFC

在异步RFC(aRFC,asynchronous RFC)中,执行并不依赖于RFC服务器系统的可用性。被调用的远程功能启动以后,调用程序继续运行,远程功能和调用程序处理相互分离。远程功能的结果能够稍后接收。

       使用 STARTING NEW TASK <task name>附加关键字,能够异步的调用一个远程函数模块。任务名称能够任意选择。被调用的函数模块在它本身的工做进程中执行。只能处理两个系统异常(COMMUNICATION_FAILURE 和 SYSTEM_FAILURE)

3. 事务性RFC

事务性RFC(tRFC,taansactional RFC)广义上也属于异步通讯模式,调用程序不接收调用结果而继续运行,但并不当即启动远程功能。相关联的RFC可捆绑至一个事务(即逻辑工做单元LUW,logical unit of work)中,而后经过事务性处理,将LUW内部各个调用中的更新操做做为总体提交或所有取消,且保证全部操做只执行一次,以确保RFC功能的可靠和安全。

       在同步和异步RFC中,每一个调用都在远程系统里建立·一个独立的工做逻辑单元(LUW),能够用事务RFC把多个远程函数分组到一个LUW中,若是发生错误则具备自动回滚机制。用IN BACKGROUND TASK附加关键字来使用tRFC,必须放在DESTINATION条目以前

4. 队列RFC

队列RFC(qRFC,queued RFC)是事务性RFC功能上的进一步扩展。在事务性RFC中,存在多个LUW时,这些LUW的执行次序是没法肯定的。若是要确保每一个LUW都按照指定的顺序执行,能够经过队列RFC对事务性RFC进行序列化。

     要确保事务性RFC调用中的LUW都按照其建立次序执行,须要使用队列RFC建立LUW序列。队列RFC(qRFC)是事务性RFC(qRFC)的加强版,可用于SAP-SAP及SAP-非SAP之间的链接。tRFC调用前经过函数模块TRFC_SET_QUEUE_NAME指定想要使用的队列

5. 并行RFC

并行RFC(pRFC,parallel RFC)实质上为异步RFC,在功能上实现多个SAP系统或同一SAP系统内部不一样应用服务器间,以及应用服务器内部各个工做过程的并行处理。

      特殊的RFC,它是aRFC的一种扩展类型。由于它改善了系统的性能,在执行大量的aRFC时。SAP使用它在MRP(Material Requirement Planning 物料需求计划)里面提升速度。

上述模式中的前三种是RFC的基本模式,而队列RFC和并行RFC能够视为是基本模式的扩展或衍生。

RFC  Remote function Call 远程功能调用, 是SAP系统之间以及非SAP系统之间程序通讯的基本接口技术. 例如BAPI , ALE都是基于RFC实现的。

RFC链接类型:

1.
类型2 R/2链接

2.
类型3 ABAP链接或R/3链接,指定主机名和通讯服务

3.
类型I:内部链接,与当前系统链接到同一ABAP系统中,预约义没法修改,与SM51中所显示的应用服务器名相同

4.
类型L:逻辑目标,一般工做流系统指定过程当中配置的RFC目标即为该类型的逻辑目标

5.
类型X:指定安装了特殊的ABAP设备驱动程序的系统,必须制定ABAP设备驱动程序名

6.
类型S:经过SNAAPPC启动的外部程序链接

7.
类型M:经过CMCABAP系统的异步RFC链接

8.
类型T:经过TCP/IP并使用RFC库或SAP链接器的外部程序链接;分为启动(指定主机名、程序路径名)和注册(RFC服务器程序)两种链接模式。

9.
类型G:定义外部系统到本地HTTP链接

10.
类型H: 定义ABAP系统到本地的HTTP链接

远程调用RFM(经过RFM实现)

1.
远程目标能够是文字或变量,其值为SAP系统中一直的远程目标系统。

2.
若远程系统是当前系统中的SAP应用服务器,也能够直接指定应用服务器名称,则SM59中的I类型目标

3.
SM59
定义的RFC目标是区分大小写的DESTINATION附加项中目标变量的值必须与其彻底一致。

具体说明:

      经过CALL FUNCTION语句进行远程功能调用时,可造成不一样的调用模式:

1.      CALL FUNCTION DESTINATION 以同步RFC方式实现RFM调用,若后面无其余附加项,则造成同步RFC调用,调用程序等待远程调用结果以继续执行

2.      CALL FUNCTION STARTING NEW TASK 以异步RFC方式实现RFM调用,调用程序不等待远程调用结果继续执行,结果将在回调子程序(callback subroutine)中接收

3.      CALL FUNCTION IN BACKROUND TASK 以事务性RFC方式实现RFM调用,远程功能暂不开始执行,等待COMMIT WORK 语句出现时,一次性执行一个或多个远程功能

      远程功能调用时,仅容许经过值传递参数,不能进行引用传递,由于在RFC过程当中,能够传递参数,并返回结果,但不能改变调用程序的上下文

      对表类型参数,在本地普通功能调用中默认为引用传递,不须要建立内表的本地副本,RFC不支持引用传递机制,将进行隐式的值传递调用,必须在RFC客户和RFC服务器之间交换整个表,只传输实际表格,若是没有指定表参数,则在被调用功能中使用空表。

      RFC使用delta管理机制最小化参数和结果传递构成中的网络负载,delta的意思就是只传递已经变化的数据。

RFC上下文:

      SAP程序本地正常状况调用功能模块是,模块将在调用程序的工做过程内部运行(work process),可是系统调用功能模块RFM时,系统将在独立的工做进程中运行该模块。经过RFC接口进行的全部远程功能调用都在目标系统中存在一个独立的RFC上下文,即该RFC内存滚动区roll area。

      执行RFC服务器系统中的远程调用功能后,该功能模块的功能组将被加载至运行时程序上下文的会话,即功能模块的主程序(或非ABAP得RFC服务器程序)。

      一旦初始化了一个功能模块,程序就将整个功能组载入至主程序的上下文,并保持至调用程序结束。

      目标为非SAP系统时,该功能经过RFC库中的API实现(RfcAbort或RfcClose),或经过功能模块RFC_CONNECTION_CLOSE显示关闭RFC链接

 RFM调用中的LUM和隐式数据库提交

      SAP存在特定的数据库提交和回滚机制,该机制就是经过LUW(逻辑工做单元)实现的。一般状况下的功能模块和柱程序位于相同的LUM中,所以不会触发数据库提交或回滚的过程(该过程一般经过COMMIT/ROLLBACK语句显示触发)。但同步RFC和异步RFC调用中的每个功能模块都拥有本身的LUM,即在每次远程调用时,当前程序都将进行内存区的释放,所以将触发隐式的数据库提交,以前的全部数据库更新将不能回滚,对于事务性RFC,则有管机制将多个远程调用操做绑定至同一个LUM,总体提交或回滚。

RFM调用中的对话处理

对于同步RFC和异步RFC调用,能够存在对话dialog过程,例如call screen \ call transaction或列表处理等状况,RFC能够进行后台处理,但若是在后台中心处理RFC中的对话,则将致使程序中断,从而触发系统异常SYSTEM_FAILURE。

RFM调用

    在进行ABAP-ABAP同步RFC和异步RFC调用时,能够进行调试以监控远程系统中RFC功能执行的状况,能够设置静态断点、单步执行、观察变量等功能,对于同步RFC,系统在当前会话中进入远程调式界面,对于异步RFC,系统将打开新会话进行远程调试

RFC与Unicode

Unicode是一种编码体系,创建在Unicode编码体系上的系统称为Unicode系统,在Unicode系统和非Unicode系统间进行RFC调用时,可能会出现与代码页(code page)转换相关的问题

 同步RFC方式的RFM调用

       同步RFC要求远程系统在调用时可用,调用程序的处理暂停,并等待远程功能调用的返回结果再继续。

对于表类型参数,只有扁平结构内表能够被传输,其余类型参数能够用于传输纵深类型以及STRING类型的数据,将内表经过tables参数进行传输将获取较快的传输速度,由于系统内部经过的二进制格式而不是XML格式进行传输。

      若是远程RFM处理时出现交互对话过程,将在当前调用程序的会话中先进行远程对话处理,处理结束后再继续调用程序

在远程系统为SAP ABAP系统的状况下,能够对功能模块进行正常的调试,即step in远程模块,系统在当前会话中进行远程调试,完成后再回到调用程序的调试界面。

同步调用的异常处理:

      同步调用RFC时,系统自动处理标准异常communication_failure和system_failure

      若在系统中没有正确维护远程目标,或到远程系统的链接不能创建,系统将触发communication_failure异常

      若链接成功,但指定的远程功能不存在于目标系统中,系统将触发system_failure

在上程序加错误处理:

  • Exceptions: 
  • Communication_failure = 1 message meg_text.  
  • System_failure = 2 message meg_text.  

      若发生异常,不会引发Short Dumpt中断,与该异常相关的中断的首行说明内容被传递到message附加项指定的变量msg_text中,变量类型为扁平的字符结构。

    • 确保远程目标在SM59种被维护
    • 确保功能模块存在于该目标系统中

异步RFC方式RFM调用:

  • CALL FUNCTION rfm_name   
  •   STARTING NEW TASK taskname  
  •   [DESTINATION dest]   
  •   [EXPORTING   p1 = a1 ... pn = an ... ]  
  •   [TABLES      t1 = itab1 ... tn = itabn ... ]   
  •   [EXCEPTIONS  exc1 = e1 ... [MESSAGE mess] ...  
  •   excn = en ... [MESSAGE mess] ...   
  •   [OTHERS = n_others].  

STARTING NEW TASK 指明异步调用模式,功能模块在新的工做过程当中执行,也能够再后台模式处理异步RFC调用过程,在后台处理时,每一个异步RFC调用也将占据一个对话工做过程。

      异步RFC调用过程只能使用TABLES、EXPORTING(对应功能模块设定中的Import参数)、EXCEPTIONS参数。调用程序并不等待该模块的返回结果,于是不能指定IMPORTING 参数,即不能直接接收从被调用功能中的返回信息。调用的同时只能接收系统标准异常,对于功能模块中抛出的其余特色异常则不能直接接收

 异步远程对话处理和调试

  • 异步RFC调用过程也支持远程对话处理,在异步RFC调用时,系统老是打开新的工做进程,于是若是被调用功能模块包含对话程序(屏幕调用处理),则在该功能模块执行时,调用系统中将出现新的外部会话窗口,若调用功能时打开的会话数本身达到6个,则试图打开新窗口时触发system_failure.
  • 异步RFC调用时,对RFM进行step in的调试过程,调用程序自己的调试会话不会进入RFM内部,系统也打开新的会话,单独增长一个窗口,进行目标系统中RFM的调试,将断点放在RFM的CALL FUNCTION语句处,在异步RFC模式下进行调试

 异步RFC调用时接收结果

经过语句中的附加项PERFORMING return_form on end of task 实现

  • CALL FUNCTION rfm_name  
  •  
  •   STARTING NEW TASK taskname  
  •  
  •   PERFORMING return_form ON END OF TASK  
  •   ...  
  • FORM return_form USING taskname.  
  • RECEIVE RESULTS FROM FUNCTION rfm_name  
  • ENDFORM.  

      子程序必须存在于调用程序中,若是回调子程序中包含任何使当前程序执行中断的语句,call screensubmitcommit workwaitRFC调用及WI类型的消息等,则不能成功返回结果。

参考程序源代码:

DATAuser_addr TYPE user_addr,
      system_id TYPE sysysid,
      user_para LIKE TABLE OF usr05 WITH HEADER LINE,
      msg_text(128).

CALL FUNCTION 'ZRFC_USER_READ'
  DESTINATION 'GS4CLNT100'
  STARTING NEW TASK 'B1'
  PERFORMING return_user ON END OF TASK
  EXPORTING
    user_name             'JIAH'
  EXCEPTIONS
    communication_failure 1  MESSAGE msg_text
    system_failure        2  MESSAGE msg_text.

IF sy-subrc 0.
  WRITE'Wait for reply.'.
ELSE.
  WRITE msg_text.
ENDIF.

IF user_para IS INITIAL.
  WRITE:'Destination not ready yet.'.
ELSE.
  WRITE:'Destination is reached.'.
ENDIF.

AT USER-COMMAND.
* Return from FORM routine RETURN_USER via SET USER-COMMAND
  IF sy-ucomm 'OKCD'.
    IF msg_text space.

      WRITE'Destination system'system_id.

      LOOP AT user_para.
        WRITE:/ user_para-bname,
                user_para-parid,
                user_para-parva.
      ENDLOOP.
    ELSE.
      WRITE msg_text.
    ENDIF.
  ENDIF.
*&---------------------------------------------------------------------*
*& Form  RETURN_USER
*&---------------------------------------------------------------------*
FORM return_user USING taskname.

  RECEIVE RESULTS FROM FUNCTION 'ZRFC_USER_READ'
    IMPORTING
      user_addr       user_addr
      system_id       system_id
    TABLES
      user_para       user_para
    EXCEPTIONS
      communication_failure  MESSAGE msg_text
      system_failure         MESSAGE msg_text.
  SET USER-COMMAND 'OKCD'.
ENDFORM.                    "return_info

Receive results from functionRFM中接收结果.

     程序在运行时的行为以下:主程序运行期间,RFM在其余工做过程当中运行,所以系统变量sy-subrc和程序变量不会被更新,主程序将文本发送至输出列表的缓冲区中。

语句WAIT UNTILL用于异步RFC调用中等待结果的返回,该项必须与performing附加项配合使用,不然没有意义:

WAIT UNTIL log_exp [UP TO sec SECONDS].

当知足log_exp条件后,程序继续执行,不然程序将挂起,并等待异步RFC调用的返回结果,当功能模块调用结束时,系统将自动执行回调子程序,在其中接收返回结果并设定相关的逻辑条件变量值,子程序结束后将回到wait untill语句,在多个异步RFC调用存在的状况下,等待过程将反复重复,直到等待条件被知足,或再也不有其余开发的异步RFC调用

WAIT UNTILL NOT FLAG1 IS INITIAL AND NOT FLAG2 IS INITIAL.

 保持远程上下文:

receive语句中,经过keeping task附加项可使已经加载的远程上下文保持至调用程序结束,直到远程链接终止为止。

并行RFC方式的RFM调用

实际是异步RFC调用的应用之一。

异步RFC调用实现并行处理:

      异步RFC调用适用于多个SAP ABAP系统间的并行处理(不支持SAP系统和其余系统间的并行过程)

      在同一SAP系统内部使用异步RFC调用,将部分处理负载转移到其余的应用服务器,方法时将RFC目标指定为其余应用服务器

      若不显示指定异步RFC调用目标,在同一应用服务器内,能够经过本地异步RFC调用实现多个工做过程的并行处理

      T-CODE: SM59 可将SAP系统中的应用服务器分配成不一样的RFC分组,异步调用时,经过DESTINATION子句中的IN GROUP附加项指定一个已定义的RFC分组。若不显示指定RFC组,还可使 用关键字DEFAULT,系统从所有可用的应用服务器中选择一个处理。

参考源代码:

TYPESBEGIN OF task_type,

             name TYPE string,

             dest TYPE string,

           END OF task_type.

DATAsnd_jobs  TYPE i,

      rcv_jobs  TYPE i,

      exc_flag  TYPE i,

      info      TYPE rfcsi,

      mess      TYPE LENGTH 80,

      indx      TYPE LENGTH 4,

      name      TYPE LENGTH 8,

      task_list TYPE STANDARD TABLE OF task_type,

      task_wa   TYPE task_type.

DO 10 TIMES.

  indx sy-index.

  CONCATENATE 'Task' indx INTO name.

  CALL FUNCTION 'RFC_SYSTEM_INFO'
    STARTING NEW TASK name
    DESTINATION IN GROUP DEFAULT
    PERFORMING rfc_info ON END OF TASK
    EXCEPTIONS
      system_failure        1  MESSAGE mess
      communication_failure 2  MESSAGE mess
      resource_failure      3.

  CASE sy-subrc.

    WHEN 0.

      snd_jobs snd_jobs + 1.

    WHEN OR 2.

      MESSAGE mess TYPE 'I'.

    WHEN 3.

      IF snd_jobs >= AND

         exc_flag 0.

        exc_flag 1.

        WAIT UNTIL rcv_jobs >= snd_jobs

             UP TO SECONDS.

      ENDIF.

      IF sy-subrc 0.

        exc_flag 0.

      ELSE.

        MESSAGE 'Resource failure' TYPE 'I'.

      ENDIF.

    WHEN OTHERS.

      MESSAGE 'Other error' TYPE 'I'.

  ENDCASE.

ENDDO.

WAIT UNTIL rcv_jobs >= snd_jobs.

LOOP AT task_list INTO task_wa.

  WRITE/ task_wa-nametask_wa-dest.

ENDLOOP.

*&---------------------------------------------------------------------*

*&      Form  rfc_info

*&---------------------------------------------------------------------*

FORM rfc_info USING name.

  task_wa-name name.

  rcv_jobs rcv_jobs + 1.

  RECEIVE RESULTS FROM FUNCTION 'RFC_SYSTEM_INFO'

    IMPORTING

      rfcsi_export info

    EXCEPTIONS

      system_failure        MESSAGE mess

      communication_failure MESSAGE mess.

  IF sy-subrc 0.

    task_wa-dest info-rfcdest.

  ELSE.

    task_wa-dest mess.

  ENDIF.

  APPEND task_wa TO task_list.

ENDFORM.                    "rfc_info

WAIT UNTILL LOG_EXP UP TO N SECONDS.程序中断时间最长是N

事务性RFC方式的RFM调用:

      同步、异步RFC过程当中,每个RFC调用在远程系统中构成一个独立的LUW

      事务性RFC调用,能够将多个逻辑上相关的远程调用绑定至同一个LUW上,在该LUW内,按顺序调用,要么执行全部数据库操做,要么彻底回滚来取消所有数据库更新操做,保证RFC调用过程的完整性和数据一致性

事务性RFC调用处理保证在程序到达COMMIT WORK语句时执行全部计划的更新,并保证事务性RFC调用仅运行一次

该调用具备安全、可靠的特色

CALL FUNCTION rfm_name   

IN BACKGROUND TASK  

  [DESTINATION dest]   

  [EXPORTING   p1 = a1 ... pn = an ... ]  

  [TABLES      t1 = itab1 ... tn = itabn ... ]   

  [AS SEPARATE UNIT].  

  CALL FUNCTION rfm_name   

  IN BACKGROUND UNIT oref  

  [EXPORTING   p1 = a1 ... pn = an ... ]  

  [TABLES      t1 = itab1 ... tn = itabn ... ].  

     其中oref必须引用一个接口IF_BGRFC_UNIT实现类的对象

     在相邻两个COMMIT WORK之间出现的全部相同目标的异步调用都属于同一个LUW

     事务性RFC不须要等待每一个单独的更新过程完成,调用程序就能够当即继续进行,知道事务结束

     若调用发送时,远程系统不可用,调用将设为后台做业运行,不能从调用模块接收返回结果,不容许调用者进行与远程系统的交互性对话及测试

     调用参数

      不能直接或经过RECEIVE RESULTS FROM FUNCTION语句接收RFM的返回结果,FM的接口不该指定任何EXPORT类型参数,在CALL FUNCTION语句中的IMPORTING参数将致使编译错误

      事务性运行的功能模块中不适合进行回调(调用远程目标BACK)

      事务性RFC调用示例

CALL FUNCTION 'TRAVEL_BOOK_REMOTE'

   IN BACKGROUND TASK  

   DESTINATION 'GSE'

   EXPORTING  

     FLIGHT     = sflight  

 CUSTOMERID = customer.  

 …  

 COMMIT  WORK.  

      直到COMMIT WORK 语句才开始于远程系统进行联系

      TRAVEL_BOOK_REMOTE是一个适合进行事务性RFC调用的RFM,只进行远程系统中的数据库更新,不须要返回任何数据

 事务ID

      每个事务性RFC调用均经过一个独特的事物ID(Transactional ID,TID)

      TID存在于数据库表ARFCSSTATE和ARFCSDATA,ARFCSSTATE记录LUW执行状态,ARFCSDATA包含事务性RFC调用的输入数据

      做业执行过程当中,从事务性RFC表中读取相关数据,与相应的事务性RFC进行通讯,远程LUW成功执行,则相应的条目在表中删除,所以,若LUW运行成功,则没法从新执行于是保证了仅仅执行一次

  若COMMIT WORK同时触发了本地更新操做,则事务性RFC调用在本地更新成功完成以后才开始运行

 设定做业开始时间

  若是但愿在特定时间启动LUW,能够经过功能模块START_OF_BACKGROUPTASK设置做业开始的时间,必须在LUW内部调用该功能模块,必须在第一个CALL…IN BACKGROUNDTASK语句以后和COMMIT WORK语句以前调用该功能模块

  对于某个调用须要建立独立的事务,不参与其余目标的事务性RFC调用做何至一个LUW,能够经过AS SEPARATE UNTIAL附加项实现

  各个LUW处理都是独立进行的,执行次序没法被保证

 出错处理机制

  发生错误,事务性RFC调用将启动重试机制或者回滚

  经过COMMIT WORK执行远程调用时,不能创建到目标系统的链接,将在ARFCSSTATE表中记录当前状态,系统经过报表RSARFCSE根据当前的TID从新计划后台做业,准备进行下一次调用。

  默认时间间隔15分钟,尝试至30次为止

  Tools-Administraion-Administraion-Network-RFCdestinations-Destination-TRFC options进行尝试次数、时间间隔设定

  若通过最大尝试次数,系统仍然没法链接,系统将中止调用报表RSARFCSE,将ARFCSDATA状态更新为CPICERR,默认8天,将表中的响应条目删除,SM59能够手动启动该条目

  执行出错,A类型的消息或者RAISE语句抛出异常,则ARFCSSTATE表将记录出错状态,整个RFC中的操做将取消, SM58查看该错误,修改错误后,经过SM58从新启动出错的RFM

  在RFM中,功能模块RESTART_OF_BACKGROUNDTASK启动重试功能

 检查事务性RFC调用状态:

  每一个LUW都用过惟一的TID进行标识,两种方法检查TID状态:

  ABAP程序:在CALL… IN BACKGROUND TASK以后和COMMIT WORK以前调用FM“ID_OF_BACKGROUNDTASK”,得到TID后,用FM“STATUS_OF_BACKGROUNDTASK”肯定事务性RFC的状态

CALL FUNCTION 'TRAVEL_BOOK_REMOTE'

   IN BACKGROUND TASK  

   DESTINATION 'GSE'

   EXPORTING  

     FLIGHT     = sflight  

     CUSTOMERID = customer.  

 ...  

 CALL FUNCTION 'ID_OF_BACKGROUNDTASK'

   IMPORTING TASK-ID = tid.  

 ...  

 CALL FUNCTION 'STATUS_OF_BACKGROUNDTASK'

   EXPORTING  

     TID      = tid  

   IMPORTING  

     ERRORTAB = errtab  

   EXCEPTIONS  

     COMMUNICTATION = 01 "Connection not available: will try again later  

     RECORDED       = 02 "ARFC is scheduled  

     ROLLBACK       = 03 "Rollback triggered in target system  

 ...  

 COMMIT WORK.  

  联机确认:经过SM58显示并维护事务性RFC的LUW状态

   队列RFC方式的RFM调用

  确保事务性RFC调用中的LUW都按照其建立次序执行,须要使用队列RFC建立LUW序列。

  队列RFC是事务性RFC的加强版本,用于SAP-SAP及SAP-非SAP系统间的链接

  多个FM发送至目标系统中的三种可能状况(实际的链接过程仍然经过事务性RFC来实现,能够增长入站、出站队列),普通事务性RFC、含出站队列的队列RFC、含出入站队列的队列RFC,出站队列在队列RFC中是必须的

  出站调度器用于控制其余逻辑目标系统中的LUW执行

  入站调度器控制本地系统中的队列RFC执行(目标NONE或IN BACKGROUND TASK实现为指定目标RFC)

  事务SMQS能够配置出战的队列RFC序列

  事务SMQR能够配置入站的队列RFC序列

  须要在普通事务性RFC调用以前使用功能模块TRFC_SET_QUEUE_NAME来指明后续的事务性RFC所要插入的出战队列

  经过FM TRFC_SET_QIN_PROPERTIES来完成,入站队列

  本地RFM调用和回调

  经过DESTNATION附加项的两个特殊目标NONE和BACK,能够进行RFM本地远程调用和回调

  调用本地系统中的远程功能模块,即调用当前系统内部的RFM

      CALL FUNCTION语句格式决定以远程调用、非远程调用方式运行

     远程调用:

 CALL FUNCTION rfm_name  

   DESTINATION 'NONE'

   ...  

 CALL FUNCTION ‘RFC_CUSTOMER_GET’  

   DESTINATION 'NONE'

   EXPORTING  

 KUNNR = custno  

   TABLES  

 CUSTOMER_T = itab  

   EXCEPTIONS  

 NO_RECORD_FOUND = 01.  

  本地调用:call function 语句没有destination、starting new task、in background task\unit任意出现,不在单独的内存滚动区中运行,若当调用没有指定某些必选exporting参数时,会引发系统异常终止

CALL FUNCTION ‘RFC_CUSTOMER_GET’  

 EXPORTING  

    KUNNR = CUSTNO  

 TABLES  

    CUSTOMER_T = ITAB  

 EXCEPTIONS  

    NO_RECORD_FOUND = 01.  

 CALL FUNCTION rfm_name  

 DESTINATION SPACE.  

远程回调:

  在服务器执行远程功能时,该服务器能够调用客户中随调用程序载入内存的功能模块,称为回调

  经过特殊目标BACK能够触发回调机制

CALL FUNCTION rfm_name

DESTINATION ‘BACK’

只有同步调用时,才能够在服务器中被调用功能模块中使用BACK功能

各类RFC调用总结:

同步RFC调用须要等待RFM返回结果;异步RFC不须要,但须要经过RECEVICE语句在回调子程序中接收结果;事务性RFM不能接收RFM返回值

同步异步RFC调用,服务器系统必须在调用时可用;事务性RFC无此限制

同步异步RFC调用过程,容许用户与远程系统进行交互对话;事务性RFC不容许

同步异步RFC调用过程,参数值将直接传输至支持远程调用的功能模块;事务性RFC,参数值暂时存储在数据库中

对于异步RFC,只适用于SAP系统内部或之间的调用,不能经过T类型目标链接至外部系统

事务性RFC、队列RFC支持状态查询

相关文章
相关标签/搜索