五種RFC類型的簡介:
Remote Function Call (RFC)是SAP所提供的溝通介面,用於串連兩個不同的系統,進行資料的交換。
RFC的種類可以分為以下五種:
- Synchronous RFC(sRFC)
- Asynchronous RFC(aRFC)
- Transactional RFC (tRFC)
- Queued RFC (qRFC)
- Parallel Process with Asynchronous RFC (pRFC)
以下依序介紹:
- Synchronous RFC(sRFC)
RFC的第一個版本是synchronous RFC (sRFC):
CALL FUNCTION func DESTINATION dest
parameter_list.
- 這是最為常見的RFC類型,適合在需要立即得到執行結果的時候使用。
- 用同步更新的方式執行Function call synchronous communication。在執行RFC的時候,所有關聯的系統都必須是可使用的。
- 會立刻呼叫目標伺服器,原始程式會停止直到獲得RFC的結果 。
- 如果DESTINATION沒有輸入或空白的話,系統會把RFC視為一般的Function call。
CALL FUNCTION 'YJE_TRFC' DESTINATION 'YJE_IDES2'
EXPORTING
PI_ROWS = c_rows
TABLES
PT_YJERFC = gt_yjerfc .
Asynchronous RFC(aRFC)
在需要增加效能的時候,aRFC是一個很好的選擇。因為aRFC可以平行的呼叫多個Function,不用等待Function處理完畢。
CALL FUNCTION func STARTING NEW TASK <taskname> DESTINATION dest
parameter_list .
1. 非同步處理Asynchronous,使用aRFC的時候,主程式不用等待aRFC處理完畢,會立刻執行下一行程式碼。系統建立System Call之後,會在目標伺服器上建立一個新的Session,直到RFC處理結束。
2. aRFC的參數會直接傳到目標伺服器,不會暫存於DB中,所以必須確保目標伺服器是可用的。
3. aRFC可以回傳參數與處理結果,增加PERFORMING ... ON END OF TASK的語法來做後續處理。taskname為自定義的獨特名稱,就像Memory ID。搭配「WAIT UNTIL」來取得結果。
4. 無法控制RFC執行的順序。
g_result_count = 0.
CALL FUNCTION 'YJE_ARFC' DESTINATION 'YJE_IDES2' STARTING NEW TASK 'TASK001'
PERFORMING resp_1 ON END OF TASK
EXPORTING
pi_rows = c_rows.
WAIT UNTIL g_result_count = 1.
FORM resp_1 USING taskname.
DATA: l_uzeit.
BREAK-POINT.
CLEAR gt_yjerfc.
RECEIVE RESULTS FROM FUNCTION 'YJE_ARFC'
IMPORTING " 只能 IMPORT ,不能 EXPORT
pe_uzeit = l_uzeit
TABLES
pt_yjerfc = gt_yjerfc.
add 1 to g_result_count.
ENDFORM.
Transactional RFC (tRFC)
tRFC可以把多個Function Call包起來放在tRFC LUW裡面,直到程式下了COMMIT WORK,系統才會開始執行RFC Call。
CALL FUNCTION func IN BACKGROUND TASK
DESTINATION dest
parameter_list
COMMIT WORK
1. 系統偵測到tRFC的呼叫,系統會指定一個唯一的Transaction ID,並把Function Call紀錄在DB中,然後繼續執行後續的程式碼,就像aRFC一樣,差別在於tRFC並不會立刻去執行RFC Call。
2. 直到程式下了COMMIT WORK,系統才會開始執行RFC Call。tRFC LUW裡面的function call將會一起被commit work或是rollback work。
3. tRFC的SY-SUBRC一定等於「0」,因此無法在Main Program來進行錯誤處理。但是可以用SM58來進行監控,SM58還可以重新啟動因為錯誤而停止的Function Call。
4. 因為tRFC無法回傳參數,如果要作錯誤處理的話可以用email等方式。
CALL FUNCTION 'YJE_TRFC' IN BACKGROUND TASK
DESTINATION 'YJE_IDES2'
EXPORTING
PI_ROWS = c_rows
PI_VKGRP = l_vkgrp
PI_SAVE = l_commit.
Queued RFC (qRFC)
CALL FUNCTION 'TRFC_SET_QUEUE_NAME'.
EXPORTING
QNAME = 'QUEUE1'.
CALL FUNCTION func IN BACKGROUND TASK
DESTINATION dest
parameter_list
COMMIT WORK
tRFC雖然同一個TID中的function call會依照順序執行,但無法指定多個TID的執行順序。qRFC是tRFC的延伸,會依照Queue的順序來傳送LUW。
1. 使用qRFC的語法就是在tRFC的呼叫之前,先呼叫「TRFC_SET_QUEUE_NAME」。這會讓系統知道要把接下來的RFC Call放置到哪一個Queue之中。
2. 跟tRFC很像,RFC Call會等到COMMIT WORK之後執行。
3. 可以使用SMQ1來監控Queue裡面的LUW順序;使用SM58監控RFC處理結果。
CALL FUNCTION 'TRFC_SET_QUEUE_NAME'
EXPORTING
qname = 'YJE_QUEUE_1'
EXCEPTIONS
invalid_queue_name = 1
OTHERS = 2 .
l_vkgrp = 110.
CALL FUNCTION 'YJE_TRFC' IN BACKGROUND TASK
DESTINATION 'YJE_IDES2'
EXPORTING
pi_rows = c_rows
pi_vkgrp = l_vkgrp
pi_save = l_commit.
COMMIT WORK.
Parallel Process with Asynchronous RFC (pRFC)
pRFC是aRFC的延伸,目標是使用多台SERVER來分散系統的負擔,以縮短程式的處理時間。適用於資料量大、處理時間久的程式(ex: MRP)。
CALL FUNCTION <Remotefunction> STARTING NEW TASK <Taskname>
DESTINATION IN GROUP <Groupname>
1. 因為pRFC無法保證執行的順序,所以處理的資料必須為獨立元件---不依賴其他在parallel processing的元件;不適合需要依照順序執行的需求。
2. pRFC依照Destination Group的設定來進行loading balance,在heavy loading的程式使用pRFC取代aRFC,可以提高系統運作的效能。
3. pRFC依照Destination Group的設定的server來分配loading。
pRFC Reference:http://help.sap.com/saphelp_470/helpdata/en/fa/096e92543b11d1898e0000e8322d00/content.htm
總結:
sRFC | aRFC | tRFC | qRFC | pRFC | |
執行時間 | 立刻 | 立刻 | 等待COMMIT WORK | 等待COMMIT WORK | 立刻 |
執行方式 | 同步 | 非同步 | 非同步(只執行一次) | 非同步(照順序執行一次) | 非同步 |
回傳參數 | 支援 | 支援 | 不支援 | 不支援 | 支援 |
監控方式 | 無法 | 無法 | SM58 | SM58 | 無法 |
備註:
l 設定Destinations: In transaction SM59, choose Tools ® System Administration ® Administration ® Network ® RFC Destinations.
l 設定Destinations Group: In transaction RZ12
l 如果是"ABAP-to-ABAP" RFCs,可以使用DEBUG來偵錯
l RFC中無法使用obligatory屬性(因為系統在背後會自動產生一段程式碼,呼叫RFC並傳入所有參數),替代方案是全部宣告成Optional,然後使用「IF field IS NOT SUPPLIED」來作錯誤處理。
沒有留言:
張貼留言