點擊藍字 關注我們
一
前言
并發執行是指把需要處理的數據切分成若干份并同時調度多個進程同時執行多份數據的處理,以便快速完成整體數據的處理.
切分數據基于業務邏輯,沒有固定的模式,一般需要確保數據均勻,可重現. 可以使用單號,單據類型,月,地點,公司等維度切分數據.
調度多進程可以使用系統提供的ARFC調用方式實現.
并發調度的主進程可以前臺/后臺執行,負責協調發起并發子進程并搜集子進程返回的結果
本文主要介紹通過ARFC啟動多個進程的一些注意事項
關于后臺作業的并發調度
詳見鏈接無峰,公眾號:ABAP 技巧與實戰SAP工具箱 增強后臺作業調度程序詳解(一)
詳見鏈接無峰,公眾號:ABAP 技巧與實戰SAP工具箱 增強后臺作業調度程序詳解(二)
二
ARFC調用
ARFC調用的主要參數
DESTINATION? RFC函數執行的目標系統, 可以指定一個事務代碼SM59維護的RFC目標(圖二).DEFAULT或者為空表示當前系統
IN GROUP ? ? 指定一個通過RZ12維護的資源組(圖三),DEFAULT或者為空表示使用當前服務器的默認資源.通過指定資源組及資源組中的資源分配, 可以調度多個服務器的資源,并限定每個服務器最大進程占用量.
CALLING/PERFORMING? 指定回調方法或子例程,當并發進程執行完成后,會調用指定的回調方法或子例程,返回該并發進程執行的結果.(通過RECEIVE RESULTS FROM FUNCTION 獲取函數的返回結果)
圖一
圖二
圖三
三
并發程序的控制參數
服務器組, (IN GROUP) : 通過限定資源組,控制并發進程占用的最大服務器資源
并發的最大進程數:? 程序中自行限制并發的最大進程數,避免占用過多服務器資源,該數字受限于服務器組和系統的最大可用前臺進程.
問
怎么提供更多的進程資源供并發調度使用呢?
因為并發調度占用的是前臺(DIALOG)進程, 在確保不影響后臺作業的情況下, 可以通過RZ04創建一個分配更多前臺進程的操作模式, 然后通過RZ03把服務器切換到該操作模式, 這樣可以轉換部分后臺進程為前臺進程,提供并發調用使用.
通過服務器組把多個服務器資源放到一個資源組中. 這樣并發調度能夠使用多個應用服務器的資源.圖四的資源組 390 包含了多臺應用服務器的資源
答
圖四
四
并發調用注意事項
01
數據切分
可以把確定數據切分的內容放到內表中循環,循環中讀取其它所需的數據通過入參傳遞到RFC函數中處理,也可以在函數中根據傳入的關鍵字,自行獲取數據進行處理.
02
初始化服務器組
可以通過函數SPBT_INITIALIZE 初始化服務器組,檢查當前服務器組的可用資源是否能夠滿足用戶輸入的最大進程數,如果不滿足,報錯或者調整最大進程數, 避免出現資源錯誤.
03
每個進程調度前檢查
每個進程調度的時候,檢查一下系統是否有空閑進程, 并等待系統有空閑資源后,再CALL ARFC調度進程.
避免并發調用因為沒有空閑進程而失敗
04
控制變量
SND_JOBS :用于統計已經發送的任務數
RCV_JOBS :用于統計回調模塊接收的任務數
RUN_JOBS: 用于統計正在運行的任務數
調用后追加發出數和執行數
循環中 等待并檢查執行必須小于最大運行數,
循環后 等待并檢查所有發出的任務都已經接收到結果.(如果回調失敗導致 RCV_JOBS沒有增加,可能會導致程序一致等待,實際應用中該問題基本不會出現).
回調中追加接收任務數,減少運行任務數
05
通過任務ID識別
ARFC調用時傳遞的任務ID和回調例程返回的任務ID一致,用于識別每個任務的執行情況, 需要強調的是:分配的任務ID一定不能重復.
PERFORM 的回調參數名固定為 name
CALL METHOD 的回調參數名固定為 P_TASK
06
統計任務執行
通過內表采集所有任務的運行情況
調用前把任務ID寫入內表, 回調后讀取任務ID內表,寫入回調成功信息. 可以在任務內表中加入容易識別的數據分割關鍵字.最后通過該內表判斷處理情況, 對于失敗的任務,可以通過關鍵字識別后,發起重新調度.
實際也可以用這個內表采集的情況作為并發調度的控制信息. 用在循環末的等待中.
五
總結
并發調度使用了ARFC功能調用,因此并發調度的邏輯必須寫入到一個RFC函數中. 暫時沒有找到類方法的并發調度方式, 估計只能把類的調用封裝在RFC函數中實現.
并發調度的實現比較簡單,只需要注意文中的一些事項,即可實現比較完善的并發調度邏輯.
上述注意事項來自一個標準并發調度程序的跟蹤,相對靠譜. 當然也可以根據基本原理寫一些不同的并發控制邏輯.