ABAP RFC
1、簡述
????????遠程函數調用 (RFC) 是用于不同系統的應用程序之間的通信,包括SAP系統之間以及SAP系統與非SAP系統之間的連接通信。
????????根據類型分為Synchronous RFC,Asynchronous RFC (aRFC),Transactional RFC (tRFC),Queued RFC (qRFC),Background RFC (bgRFC),Local Data Queue (LDQ),所有 RFC 類型都通過?CPI-C或?TCP/IP 傳輸。
????????異步通信,接收系統不一定必須在從發送方系統分派函數調用時可用。接收系統可以稍后接收和處理調用。如果接收系統不可用,則函數調用保留在發送系統的出站隊列中,從那里定期重復調用,直到接收系統可以處理它。
2、RFC創建
????????1. 創建function時在屬性頁簽勾選遠程啟用的模塊
?????????2. 參數的參考類型必須勾選值傳遞,且不能使用通用類型
3、RFC調用
????????調用語句
????????和正常函數調用相比,帶有附加的?DESTINATION、?STARTING NEW TASK或?IN Background TASK、?IN Background UNIT?..等語句。
????????調用注意
????????RFC 接口進行的每個遠程功能模塊調用都在目標系統中定義了自己的上下文。功能模塊的功能組被加載到上下文的內部會話中,并被保留。這意味著,如果重復調用屬于同一目的地和同一功能組的功能模塊,則可以集中訪問該功能組的全局數據。
????????功能模塊?RFC_CONNECTION_CLOSE可用于顯式關閉連接。
????????RFC不支持“通過引用”傳輸。因此,必須將整個表傳回在 RFC 客戶端和 RFC 服務器之間來回切換。第一次調用傳遞時,創建一個本地副本,并賦予ID,之后再調用只會更新本地副本。
????????對于使用同步 RFC 進行的每個調用,都會執行一次隱式數據庫提交
????????在遠程調用的功能模塊中,不能使用關閉當前上下文并因此關閉連接的語句。比如語句?LEAVE PROGRAM,或者?SUBMIT沒有添加?RETURN。
????????RFC 僅使用按值傳遞,因此當確實發生異常時,無法在生成同步 RFC 時訪問中間結果。
????????調用異常
????????SYSTEM_FAILURE如果在遠程調用的功能模塊執行過程中發生運行時錯誤,則會發生?異常 。
????????COMMUNICATION_FAILURE如果無法與伙伴系統建立連接,或者在通信期間連接中斷,則會發生?異常 。
????????運行時異常
4、RFC DESTINATION
????????1. SM59配置,可在表RFCDES?中查看
????????2 系統內置“NONE” 功能模塊在與調用程序相同的應用服務器上啟動,不用賬號密碼,如果SM59設置本地為目的地需要賬號密碼 。(DESTINATION 'NONE' runs in its own roll area 保留遠程上下文 )
????????3 系統內置“BACK” 在遠程調用的功能模塊中使用,并鏈接回調用方,只能在已同步調用的功能模塊中指定此項,在回調時,系統總是會在建立新的 RFC 連接之前嘗試使用現有的 RFC 連接。
????????4. 基于CL_DYNAMIC_DESTINATION?實現的動態DESTINATION
????????5. 直接指定的目的地,格式為“hostname_sysid_sysnr”?!癶ostname”是指應用服務器的名稱,“sysid”是SAP系統的名稱,“sysnr”是系統編號。
5、RFC性能和資源
????????aRFC 需要具有可用的dialog進程(不是SM50中空閑dialog進程,需減去配置參數rdisp/rfc_min_wait_dia_wp設置保留為其他用途的進程數)
?????????bgRFC最少工作進程數目
?????????bgRFC 處理的性能不一定取決于調度程序的數量。在工作負載水平較低的情況下,可以使用更少的調度程序獲得更大的吞吐量。
6、同步RFC
????????概念
????????同步RFC(sRFC)直接執行函數調用,等待被調用函數模塊的回復。調用前調用數據不會寫入數據庫用來調用處理。因此,當使用同步 RFC 時,被調用系統必須可用。調用只進行一次。如果被調用系統不可用或出現問題,則調用失敗。
????????注意點
????????1. 同步 RFC 調用的功能模塊的執行不會導致更新功能中的數據庫提交(屬于隱式提交)
????????2. 使用附加 TABLES 傳輸表比使用其他附加要快得多,因為內部使用二進制格式而不是 XML 格式。
????????隱式提交測試
在執行同步RFC之前,數據未更新
????????執行完同步rfc后,當前luw數據被提交更新,更新函數未觸發
?????????執行完commit,更新函數被觸發,數據更新。RFC的隱式提交不會觸發更新函數。
7、異步 RFC
????????概念
????????異步 RFC?(aRFC) 實際上并不是嚴格意義上的異步函數調用。雖然函數在被調用后直接返回到調用程序,但調用數據并沒有真正寫入數據庫用來調用處理。因此,只能在直接可用的系統上進行調用。如果被叫系統不可用,則調用失敗。
????????特點:
????????函數在調用后直接返回調用程序,用戶不必等待其完成即可繼續調用對話
????????異步 RFC 的參數不記錄到數據庫,而是直接發送到服務器
????????異步 RFC 允許用戶與遠程系統進行交互式對話
????????當調用方啟動 aRFC 時,被調用服務器?必須可以接受請求。
????????調用程序可以接收來自異步 RFC 的結果
?????異步RFC獲取結果
CALL FUNCTION Remotefunction STARTING NEW TASK Taskname PERFORMING RETURN_FORM ON END OF TASK.? FORM RETURN_FORM USING TASKNAME.???? RECEIVE RESULTS FROM FUNCTION Remotefunction???????? IMPORTING????????????? F1 = a1???????? EXCEPTIONS????????????? SYSTEM_FAILURE MESSAGE SYSTEM_MSG. ENDFORM.????????KEEPING TASK:
在接收返回結果后保持RFC連接,保留當前遠程上下文,此時如果指定相同的任務名稱,則可以重復使用遠程上下文和滾動區域(比如被調用RFC中的全局變量,靜態變量)。
????????保持上下文:
任務 ID 對于每個調用必須是唯一的,并被傳遞給回調例程以識別函數。每個任務 ID 定義了一個單獨的 RFC 連接,具有自己的上下文,這意味著在重復調用相同任務 ID 的功能模塊的情況下,如果連接仍然存在,則可以訪問相關功能組的全局數據。
????????直接調用異步RFC,上下文效果不會保留,如下
TYPES: BEGIN OF task_type,name TYPE string,number TYPE i,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 3 TIMES.indx = sy-index.CONCATENATE 'Task' indx INTO name.CALL FUNCTION 'YLC_FUNC002'STARTING NEW TASK namePERFORMING rfc_info ON END OF TASKEXCEPTIONSsystem_failure = 1 MESSAGE messcommunication_failure = 2 MESSAGE messresource_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 ANDexc_flag = 0.exc_flag = 1.WAIT UNTIL rcv_jobs >= snd_jobsUP 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-number. ENDLOOP.FORM rfc_info USING name.DATA: lv_number TYPE i.task_wa-name = name.rcv_jobs = rcv_jobs + 1.RECEIVE RESULTS FROM FUNCTION 'YLC_FUNC002'IMPORTINGnumber = lv_numberEXCEPTIONSsystem_failure = 1 MESSAGE messcommunication_failure = 2 MESSAGE mess.IF sy-subrc = 0.task_wa-number = lv_number.ENDIF.APPEND task_wa TO task_list. ENDFORM.????????此時執行結束,由于不同的task名字,使用不同的上下文及滾動區域,因此獲取到的值是一樣的。
?????????循環中設置indx為1,使用相同的任務名稱調用異步RFC,且增加KEEPING?TASK關鍵字,注意相同任務名稱在同一個程序下不能同時打開,因此這里只用了一個進程。
TYPES: BEGIN OF task_type,name TYPE string,number TYPE i,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 3 TIMES.indx = sy-index.indx = 1.CONCATENATE 'Task' indx INTO name.CALL FUNCTION 'YLC_FUNC002'STARTING NEW TASK namePERFORMING rfc_info ON END OF TASKEXCEPTIONSsystem_failure = 1 MESSAGE messcommunication_failure = 2 MESSAGE messresource_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 ANDexc_flag = 0.exc_flag = 1.WAIT UNTIL rcv_jobs >= snd_jobsUP 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.WAIT UNTIL rcv_jobs >= snd_jobs. ENDDO.LOOP AT task_list INTO task_wa.WRITE: / task_wa-name, task_wa-number. ENDLOOP.FORM rfc_info USING name.DATA: lv_number TYPE i.task_wa-name = name.rcv_jobs = rcv_jobs + 1.RECEIVE RESULTS FROM FUNCTION 'YLC_FUNC002' KEEPING TASKIMPORTINGnumber = lv_numberEXCEPTIONSsystem_failure = 1 MESSAGE messcommunication_failure = 2 MESSAGE mess.IF sy-subrc = 0.task_wa-number = lv_number.ENDIF.APPEND task_wa TO task_list. ENDFORM.?????????異步RFC并行處理
? ? ? ? 1. 并行處理不適用于必須順序處理的數據
????????2. 使用 CALL FUNCTION STARTING NEW TASK 之后,不能再使用 SUBMIT 或 CALL TRANSACTION。
????????3. SAP 系統中的服務器必須至少有 3 個空閑對話工作進程
????????4. 并行處理時不能使用相同的任務名稱
? ? ? ??
????????SPBT_INITIALIZE 檢查group下的進程資源是否足夠
????????SPBT_GET_PP_DESTINATION 在RFC調用之后獲取運行任務的服務器的名稱
使用服務器組并行調用示例
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 nameDESTINATION IN GROUP DEFAULTPERFORMING rfc_info ON END OF TASKEXCEPTIONSsystem_failure = 1 MESSAGE messcommunication_failure = 2 MESSAGE messresource_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_jobsUP 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 USING name.task_wa-name = name.rcv_jobs = rcv_jobs + 1.RECEIVE RESULTS FROM FUNCTION 'RFC_SYSTEM_INFO'IMPORTINGrfcsi_export = infoEXCEPTIONSsystem_failure = 1 MESSAGE messcommunication_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.8、其它
????????代碼頁-不同編碼系統之間的RFC通信注意
SM59unicode頁簽下設置和非unicode系統之間的RFC通信代碼頁轉換,一般用在和國外系統對接的場景,比較少見。
?????????信任系統
????????調用事務SM59并選擇Extras???Trusted Systems(或輸入事務代碼 SMT1)。
????????RFC驗證登錄錯誤碼
?????????分析監控
????????STAD 查看調用 RFC 和 ICF 的各種統計數據
????????blog.csdn.net/xiefireworks/article/details/126257186???????
總結
- 上一篇: 怎样开启Win7快速启动栏
- 下一篇: Lacuncher3---修改文件夹图标