REPORT ZGDR0077. *基本原理:使用RFC函数的异步特征. *基本思路:将loop中串行执行的任务分成多个任务并行执行,减少执行时间。 *output. DATA: T_SBOOK TYPE TABLE OF SBOOK. *parallel processing变量 DATA: G_TASKNAME(21) TYPE C, "task name(同时运行的任务名称必须保持唯一) G_CLASSNAME TYPE RZLLI_APCL VALUE 'ZRFC_GRP'. "RFC Server Group Name(RZ12) * G_APPLSERVER TYPE RZLLITAB-APPLSERVER VALUE SY-HOST. "Instance Name. DATA: SND_JOBS TYPE I, "已启动的并发task数. RCV_JOBS TYPE I. "已返回结果的task数. DATA: P_TASKS TYPE INT1 VALUE 8. DATA: GV_MESS TYPE C LENGTH 255, "并发执行出错信息 OPEN_TASK_NUM TYPE I. "启动任务数量 DATA:L_TABIX TYPE SY-TABIX, "索引变量 L_LINES TYPE I. "总行数 START-OF-SELECTION. PERFORM FM_DATA_PROC. BREAK-POINT. FORM FM_DATA_PROC . SELECT * INTO TABLE T_SBOOK FROM SBOOK UP TO 5000 ROWS. DESCRIBE TABLE T_SBOOK[] LINES L_LINES. LOOP AT T_SBOOK ASSIGNING FIELD-SYMBOL(). *启动并行任务. "并行任务名称,用sy-tabix L_TABIX = SY-TABIX. MOVE L_TABIX TO G_TASKNAME. "并行执行需要用TASK标识区分不同进程,这样才能按G_TASKNAME接收正确的输出. "我们希望在指定的登录组内的所有服务器上并行执行,只指定登录组,不指定HOSTNAME. CALL FUNCTION 'ZFM0004' STARTING NEW TASK G_TASKNAME DESTINATION IN GROUP G_CLASSNAME PERFORMING FM_MPP_CALLBACK ON END OF TASK "回调处理,异步执行的,非阻塞. EXPORTING I_CARRID = -CARRID I_CONNID = -CONNID I_FLDATE = -FLDATE I_BOOKID = -BOOKID EXCEPTIONS COMMUNICATION_FAILURE = 1 MESSAGE GV_MESS SYSTEM_FAILURE = 2 MESSAGE GV_MESS RESOURCE_FAILURE = 3 OTHERS = 4. IF SY-SUBRC = 0. SND_JOBS = SND_JOBS + 1. ENDIF. OPEN_TASK_NUM = OPEN_TASK_NUM + 1. "记录启动的进程数量 "为合理利用资源,当开启的任务数等于8个的时候,就等待结果返回后再新开任务. IF OPEN_TASK_NUM = P_TASKS. " 获取并发进程返回的结果 WAIT UNTIL RCV_JOBS >= SND_JOBS. CLEAR: OPEN_TASK_NUM, RCV_JOBS, SND_JOBS. ELSE. "最后一行数据,等待返回结果. IF L_TABIX = L_LINES. " 获取并发进程返回的结果 WAIT UNTIL RCV_JOBS >= SND_JOBS. CLEAR: OPEN_TASK_NUM, RCV_JOBS, SND_JOBS. ENDIF. ENDIF. ENDLOOP. ENDFORM. FORM FM_MPP_CALLBACK USING PV_TASKNAME. " 由于多线程,应使用局部变量接收函数返回结果,以免使用全局变量互相影响. DATA: LV_FORCURAM TYPE S_F_CUR_PR, LV_LOCCURAM TYPE S_L_CUR_PR. DATA: L_TASKNAME(21) TYPE C. L_TASKNAME = PV_TASKNAME. RCV_JOBS = RCV_JOBS + 1. "按并行任务的taskname接收运算结果. RECEIVE RESULTS FROM FUNCTION 'ZFM0004' IMPORTING E_FORCURAM = LV_FORCURAM E_LOCCURAM = LV_LOCCURAM EXCEPTIONS COMMUNICATION_FAILURE = 1 SYSTEM_FAILURE = 2 RESOURCE_FAILURE = 3 OTHERS = 4. CHECK SY-SUBRC EQ 0. READ TABLE T_SBOOK[] INDEX L_TASKNAME ASSIGNING FIELD-SYMBOL(). IF SY-SUBRC IS INITIAL. "更新内表. -FORCURAM = LV_FORCURAM. -LOCCURAM = LV_LOCCURAM. ENDIF. ENDFORM.