点击蓝字 关注我们
一
前言
并发执行是指把需要处理的数据切分成若干份并同时调度多个进程同时执行多份数据的处理,以便快速完成数据的处理.
切分数据基于业务逻辑,没有固定的模式,一般需要确保数据均匀,可重现. 可以使用单号,单据类型,月,地点,公司等维度切分数据.
调度多进程可以使用系统提供的ARFC调用方式实现.
本文主要介绍一个并发执行的封装类的过程及应用
阅读本文之前,请参阅并发执行的概念及相关知识
参考链接
无峰,公众号:ABAP 技巧与实战ABAP基础知识 并发执行(一 概念及相关知识)
二
函数传参的通用方式
ABAP函数可以通过传递参数表的方式调用.
本来打算使用这种方式调用RFC.
程序准备调用的参数表,传递到封装类中调用RFC函数,最后再通过参数表接收内容. 但是实际测试发现RFC函数的调用不支持普通函数调用的参数表方式. 只能另想办法.
三
示例程序逻辑说明
为了测试封装类的执行,设计了一个简单的业务场景.
按销售订单号划分数据, 每个销售订单的抬头及行项目信息传入函数Z_BC_TEST_ARFC执行处理,测试函数中等待两秒
后续封装的类中调用了这个测试函数.
四
并发调用的特性归纳
对系统标准并发程序及自定义的并发程序归纳出以下共性,其中带*号的根据不同程序及函数而变化,其它部分一致
*一个循环的内表(记录划分数据的内容)
一组控制变量
一个任务统计表(写入并发执行日志表)
一个任务的函数参数传递内容记录表
循环前初始化服务器组
循环中检查空闲进程
*调用ARFC
循环末检查不超过最大进程数
循环后等待所有并发的返回
*一个回调方法
其中调用ARFC及回调方法因为ARFC调用不支持参数表的方式,只能考虑使用子类中重写方法的方式实现.
01
一个循环的内表
(记录划分数据的内容)
主体程序按照特定的业务逻辑获取数据,并生成数据对象传入类,示例程序中把销售订单抬头内表GT_VBAK传入类
02
一组控制变量
把并发执行所有需要的参数及控制变量整合到结构 ZSPARA_CONTROL中. DATA 记录了传入的划分数据的内表
03
一个任务统计表
(写入并发执行日志表)
日志表ZTPARA_LOG中引入了这个结构,补充GUID作为关键字及一些日期,事件等字段
KEYS用来记录业务数据关键字及内容, 可以通过这个字段识别任务处理的关键信息.如果出现错误,可以根据这个关键信息重新执行
关键字也是在创建类时根据业务实际情况传递.示例中传递了VBELN,KUNNR (实际用VBELN就可以了, 为了测试效果,添加了KUNNR ).
04
记录函数参数传递内容
通过这个结构记录内表每行调用函数的传递的参数及参数的内容(PAR_DATA 可以存放变量,结构,内表等),因为这个内容最终供主程序读取,所以关键字使用TABIX (主程序提供的内表的索引),而没有使用任务ID ,在任务表中也记录了这个索引
05
循环前初始化服务器组
初始化服务器组放到了类的构造方法中.根据初始化的结果调整最大并发度,如果最大并发数为1,后续实际处理时,直接调用函数. 最大并发数>1时,才使用ARFC方式调用函数
06
并发控制
循环中检查空闲进程
循环末检查不超过最大进程数
循环后等待所有并发的返回
07
调用方式
根据并发标记确定是正常调用还是并发调用,对于正常调用的,记录报错信息,记录返回的参数内容
调用前记录任务信息
记录函数的传入参数及内容
并发调用
根据并发调用的例外,记录任务的报错信息
08
一个回调方法
回调中对并发控制参数的处理
回调中获取函数返回的内容并记录到内表中,记录对函数报错的信息
五
主程序获取结果
主体程序最终获取返回的任务信息及函数传递的参数内容 通过调用方法 GET_RETURN
六
新的并发程序
使用这个封装类创建新的并发程序需要:
创建子类继承类ZCL_PARA_ARFC_CALL
子类ZCL_PARA_ARFC_CALL_DEMO1继承 ZCL_PARA_ARFC_CALL.
只需要重写方法CALL_FUNC / CALLBACK 中和函数调用相关的部分代码.
重写时复制父类中的代码,保留固定代码部分(通过注释标记).
七
新的调用程序
子类的调用程序与父类的调用程序一致,只需要改变类的定义即可.
八
示例程序执行
执行示例程序,设置并发调用,并发数
日志表记录
九
总结
子类中使用的文本对象需要从父类中复制一下,(文本对象不能自动继承或复制,这个细节SAP倒是可以优化一下).
并发调度类ZCL_PARA_ARFC_CALL主要尝试把并发调度的共性部分封装起来.并且使用通用的内容记录调度的任务信息,函数的参数传递内容.
在主体程序中可以通过GET_RETURN方法获取这些信息,以便主体程序处理后续逻辑.
后续会尝试把数据同步平台的主体程序调用使用这个类添加并发执行功能.
如果你想要本文中涉及的类及测试程序代码,可以在关注公众号,在公众号中发消息 <并发执行> 获取安装包,安装包的使用
详见链接
无峰,公众号:ABAP开发技巧SAP工具箱之 ABAP安装程序V3.0
最新版的安装程序获取方式: 公众号中发消息 <ABAP安装程序>
安装包中注释了函数
Z_BC_TIMESTAMP_GET_SECOND的调用: 你可以重写该函数 (对主体功能没有影响,只会丢失持续时间内容)
如果你在使用中发现BUG或者有什么改进意见,请不吝赐教.
THE
END
约定
如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.
(如果你真的喜欢这篇文章,请记得回来打个赏,作为支持我继续下去的动力,这是一个正反馈过程. 越多的人打赏,作者越有动力分享,读者就能享受更多的福利.毕竟打赏的金额富不了我,穷不了你,却能支持这个公众号长久发文.)
公众号 : syjf1976_abap
ABAP开发技巧
微信号 : 392077
请微信联系管理员:
syjf1976
sharry_xlp
Yannick_Duan
申请进入公众号讨论群提问或者参与话题讨论