SAP工具箱 并发执行(二 封装类)

点击蓝字 关注我们


前言

并发执行是指把需要处理的数据切分成若干份并同时调度多个进程同时执行多份数据的处理,以便快速完成数据的处理.

切分数据基于业务逻辑,没有固定的模式,一般需要确保数据均匀,可重现. 可以使用单号,单据类型,月,地点,公司等维度切分数据.

调度多进程可以使用系统提供的ARFC调用方式实现.

本文主要介绍一个并发执行的封装类的过程及应用

阅读本文之前,请参阅并发执行的概念及相关知识

参考链接

无峰,公众号:ABAP 技巧与实战ABAP基础知识 并发执行(一 概念及相关知识)

函数传参的通用方式

ABAP函数可以通过传递参数表的方式调用.

本来打算使用这种方式调用RFC.

程序准备调用的参数表,传递到封装类中调用RFC函数,最后再通过参数表接收内容. 但是实际测试发现RFC函数的调用不支持普通函数调用的参数表方式. 只能另想办法.

a6ec6dc585b129d8f43145ec79738014.png


示例程序逻辑说明

为了测试封装类的执行,设计了一个简单的业务场景.

按销售订单号划分数据, 每个销售订单的抬头及行项目信息传入函数Z_BC_TEST_ARFC执行处理,测试函数中等待两秒

后续封装的类中调用了这个测试函数.

f57054886bbd0736c9879342aa231e95.png

并发调用的特性归纳

对系统标准并发程序及自定义的并发程序归纳出以下共性,其中带*号的根据不同程序及函数而变化,其它部分一致

  • *一个循环的内表(记录划分数据的内容)

  • 一组控制变量

  • 一个任务统计表(写入并发执行日志表)

  • 一个任务的函数参数传递内容记录表

  • 循环前初始化服务器组

  • 循环中检查空闲进程

  • *调用ARFC

  • 循环末检查不超过最大进程数

  • 循环后等待所有并发的返回

  • *一个回调方法

其中调用ARFC及回调方法因为ARFC调用不支持参数表的方式,只能考虑使用子类中重写方法的方式实现.

78443b310c8ba4f2ed8fffdcb2177708.png

01

一个循环的内表

(记录划分数据的内容)

主体程序按照特定的业务逻辑获取数据,并生成数据对象传入类,示例程序中把销售订单抬头内表GT_VBAK传入类

b304069423b77f0c5858f11826210577.png

02

一组控制变量

把并发执行所有需要的参数及控制变量整合到结构 ZSPARA_CONTROL中. DATA 记录了传入的划分数据的内表

d30e43a19f4fabe8d821903f2b25e75d.png

03

一个任务统计表

(写入并发执行日志表)

日志表ZTPARA_LOG中引入了这个结构,补充GUID作为关键字及一些日期,事件等字段

KEYS用来记录业务数据关键字及内容, 可以通过这个字段识别任务处理的关键信息.如果出现错误,可以根据这个关键信息重新执行

关键字也是在创建类时根据业务实际情况传递.示例中传递了VBELN,KUNNR (实际用VBELN就可以了, 为了测试效果,添加了KUNNR ).

674ac23e34a06bf8da62434c752332aa.png

f43ddee3cb451a1291ed8c11c2403dad.png

92637f502ce850ce40890df05d30d53f.png

04

记录函数参数传递内容

通过这个结构记录内表每行调用函数的传递的参数及参数的内容(PAR_DATA 可以存放变量,结构,内表等),因为这个内容最终供主程序读取,所以关键字使用TABIX (主程序提供的内表的索引),而没有使用任务ID  ,在任务表中也记录了这个索引

171841d1b3332c2fdcb411b26b751cc9.png

05

循环前初始化服务器组

初始化服务器组放到了类的构造方法中.根据初始化的结果调整最大并发度,如果最大并发数为1,后续实际处理时,直接调用函数. 最大并发数>1时,才使用ARFC方式调用函数

3cad71724b67d2700da75143340000b1.png

06

并发控制

循环中检查空闲进程

循环末检查不超过最大进程数

循环后等待所有并发的返回

d8594532c3311fa6e1b1d7becefb4454.png

07

调用方式

根据并发标记确定是正常调用还是并发调用,对于正常调用的,记录报错信息,记录返回的参数内容

ce649127bc8dfb2f81d09721b055bd9e.png

调用前记录任务信息

c9f175735a8193edac65788b74fb5119.png

记录函数的传入参数及内容

1a72fdede29e605b3c54ecec58fdf925.png

并发调用

根据并发调用的例外,记录任务的报错信息

0ea2330a4e8f67dda357d35ec7c809bf.png

08

一个回调方法

回调中对并发控制参数的处理

2d7e679a2103a10eea98abb2846f6585.png

回调中获取函数返回的内容并记录到内表中,记录对函数报错的信息

30cb1992d453b02c69fae82801381f7a.png

主程序获取结果

主体程序最终获取返回的任务信息及函数传递的参数内容 通过调用方法 GET_RETURN

3eb3351f78a349c92ac6bc65205b804f.png

新的并发程序

使用这个封装类创建新的并发程序需要:

创建子类继承类ZCL_PARA_ARFC_CALL

子类ZCL_PARA_ARFC_CALL_DEMO1继承 ZCL_PARA_ARFC_CALL. 

只需要重写方法CALL_FUNC / CALLBACK 中和函数调用相关的部分代码.

重写时复制父类中的代码,保留固定代码部分(通过注释标记).

37e35b085f458a57dd1088c4afe16594.png

新的调用程序

子类的调用程序与父类的调用程序一致,只需要改变类的定义即可.

721130274f419905f1b90c44fa707dbd.png

示例程序执行

执行示例程序,设置并发调用,并发数

beede874d02255e693ac9689aaab1a24.png

63da6a3e885b81242592e5ba81b5a7ac.png

日志表记录

9e7b58805ea6778e1b9dcc156b5397dc.png

总结

子类中使用的文本对象需要从父类中复制一下,(文本对象不能自动继承或复制,这个细节SAP倒是可以优化一下).

并发调度类ZCL_PARA_ARFC_CALL主要尝试把并发调度的共性部分封装起来.并且使用通用的内容记录调度的任务信息,函数的参数传递内容. 

在主体程序中可以通过GET_RETURN方法获取这些信息,以便主体程序处理后续逻辑.

后续会尝试把数据同步平台的主体程序调用使用这个类添加并发执行功能.

如果你想要本文中涉及的类及测试程序代码,可以在关注公众号,在公众号中发消息 <并发执行> 获取安装包,安装包的使用

详见链接

无峰,公众号:ABAP开发技巧SAP工具箱之 ABAP安装程序V3.0

最新版的安装程序获取方式: 公众号中发消息 <ABAP安装程序>

安装包中注释了函数

Z_BC_TIMESTAMP_GET_SECOND的调用: 你可以重写该函数 (对主体功能没有影响,只会丢失持续时间内容)

如果你在使用中发现BUG或者有什么改进意见,请不吝赐教. 

0297b4ded9305ce794e654bc5c784bd3.png

THE

END

约定

如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.       

    (如果你真的喜欢这篇文章,请记得回来打个赏,作为支持我继续下去的动力,这是一个正反馈过程. 越多的人打赏,作者越有动力分享,读者就能享受更多的福利.毕竟打赏的金额富不了我,穷不了你,却能支持这个公众号长久发文.)

267800e5fe7bf7dcbbd6383e6f2adb74.png

公众号 : syjf1976_abap

          ABAP开发技巧

微信号 : 392077

请微信联系管理员: 

syjf1976 

sharry_xlp  

Yannick_Duan 

申请进入公众号讨论群提问或者参与话题讨论

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值