点击蓝字 关注我们
一
前言
并发执行是指把需要处理的数据切分成若干份并同时调度多个进程同时执行多份数据的处理,以便快速完成整体数据的处理.
切分数据基于业务逻辑,没有固定的模式,一般需要确保数据均匀,可重现. 可以使用单号,单据类型,月,地点,公司等维度切分数据.
调度多进程可以使用系统提供的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函数中实现.
并发调度的实现比较简单,只需要注意文中的一些事项,即可实现比较完善的并发调度逻辑.
上述注意事项来自一个标准并发调度程序的跟踪,相对靠谱. 当然也可以根据基本原理写一些不同的并发控制逻辑.