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支持狀態查詢

相關文章
相關標籤/搜索