SAP RFC通信模式
在網絡技術中,數據通信可以大致劃分為兩種基本模式:同步通信和異步通信。
? ? ? 其本義是:異步通信時,通信雙方時鐘允許存在一定誤差;同步通信時,雙方時鐘的允許誤差較小。在SAP的系統間的通信過程中,也借用術語同步通信和異步通信,但其主要差異在于調用系統是否需要立即接受返回結果。這兩種通信模式各有局限性,不同的應用適用于不同的通信模式。
? ? ? SAP中的同步通信是一次性的功能調用,其前提條件是在調用遠程功能時(或發送請求時),接受系統(服務器)必須是活動的,可以接受請求并進行進一步的處理(圖一)。同步調用的優點是可以即時將數據返還給發送系統;其缺點為在系統對話時必須確保兩個系統都處于活動的狀態,否則對話會出現嚴重中斷,影響業務應用的處理過程。例如,在本地系統中創建一個采購訂單,但是在保存該采購訂單之前,需要遠程訪問中心財會系統,以進行預算檢查。這個過程要求即時的檢查結果,因而需要通過同步調用實現。如果中心財會系統暫時不可用,那么采購訂單也將無法創建。
圖一 SAP中的同步通信
? ? ? SAP中的異步通信的特點是接收系統并不需要在遠程功能調用時處于激活狀態,該系統可以滯后接收并處理該調用(圖二)。如果系統部可用,已發送的請求將保存在發送系統的輸出隊列中,并每隔一段時間反復進行調用嘗試,直到接收系統對調用響應為止。異步通信的優點是不需要接收系統隨時可用,如系統維護、升級等情況均不影響請求發送系統的業務處理;但該模式不適用于要求即時響應的處理過程。例如,在系統中向外部供應商發出一個采購訂單,如果該供應商的系統暫時不可用,則該訂單暫時置于發送的請求隊列,每隔一段時間重新發送,直到供應商收到該訂單為止。這一過程可以以后臺作業形式完成。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
圖二 SAP中的異步通信
以上述兩種基本通信模式為基礎,SAP系統中的RFC過程擴展為以下幾種不同的模式。
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:通過SNA或APPC啟動的外部程序連接
7.
類型M:通過CMC到ABAP系統的異步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 screen、submit、commit work、wait、RFC調用及W或I類型的消息等,則不能成功返回結果。
參考程序源代碼:
DATA:?user_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??=?1?MESSAGE?msg_text
??????system_failure?????????=?2?MESSAGE?msg_text.
??SET?USER-COMMAND?'OKCD'.
ENDFORM.????????????????????"return_info
Receive results from function從RFM中接收結果.
? ? ?程序在運行時的行為如下:主程序運行期間,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,系統從全部可用的應用服務器中選擇一個處理。
參考源代碼:
TYPES:?BEGIN?OF?task_type,
?????????????name?TYPE?string,
?????????????dest?TYPE?string,
???????????END?OF?task_type.
DATA:?snd_jobs??TYPE?i,
??????rcv_jobs??TYPE?i,
??????exc_flag??TYPE?i,
??????info??????TYPE?rfcsi,
??????mess??????TYPE?c?LENGTH?80,
??????indx??????TYPE?c?LENGTH?4,
??????name??????TYPE?c?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?1?OR?2.
??????MESSAGE?mess?TYPE?'I'.
????WHEN?3.
??????IF?snd_jobs?>=?1?AND
?????????exc_flag?=?0.
????????exc_flag?=?1.
????????WAIT?UNTIL?rcv_jobs?>=?snd_jobs
?????????????UP?TO?5?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-name,?task_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????????=?1?MESSAGE?mess
??????communication_failure?=?2?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支持狀態查詢
總結
以上是生活随笔為你收集整理的SAP RFC通信模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 44、Power Query-具体查看函
- 下一篇: abap submit 的使用方法 不同