ABAP基础知识 并发执行(一 概念及相关知识)

点击蓝字 关注我们


前言

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

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

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

  • 并发调度的主进程可以前台/后台执行,负责协调发起并发子进程并搜集子进程返回的结果

本文主要介绍通过ARFC启动多个进程的一些注意事项

关于后台作业的并发调度

详见链接

无峰,公众号:ABAP 技巧与实战SAP工具箱 增强后台作业调度程序详解(一)

详见链接

无峰,公众号:ABAP 技巧与实战SAP工具箱 增强后台作业调度程序详解(二)


7b4add7ba260847fc5b57282730ac814.png


ARFC调用

ARFC调用的主要参数

  • DESTINATION  RFC函数执行的目标系统, 可以指定一个事务代码SM59维护的RFC目标(图二).DEFAULT或者为空表示当前系统

  • IN GROUP     指定一个通过RZ12维护的资源组(图三),DEFAULT或者为空表示使用当前服务器的默认资源.通过指定资源组及资源组中的资源分配, 可以调度多个服务器的资源,并限定每个服务器最大进程占用量.

  • CALLING/PERFORMING  指定回调方法或子例程,当并发进程执行完成后,会调用指定的回调方法或子例程,返回该并发进程执行的结果.(通过RECEIVE RESULTS FROM FUNCTION 获取函数的返回结果)

a329c7785b47ee832fbd8de54d67c6e6.png

图一

051973a3a2b15d7efe654dde9b495417.png

图二

9eac4dec76c6af2ce2de38c71b8fe523.png

图三

并发程序的控制参数

  • 服务器组, (IN GROUP) : 通过限定资源组,控制并发进程占用的最大服务器资源

  • 并发的最大进程数:  程序中自行限制并发的最大进程数,避免占用过多服务器资源,该数字受限于服务器组和系统的最大可用前台进程.

a4718fc3dcdf6b1ecc3095d80ffce6b4.png

怎么提供更多的进程资源供并发调度使用呢?

因为并发调度占用的是前台(DIALOG)进程, 在确保不影响后台作业的情况下, 可以通过RZ04创建一个分配更多前台进程的操作模式, 然后通过RZ03把服务器切换到该操作模式, 这样可以转换部分后台进程为前台进程,提供并发调用使用.

通过服务器组把多个服务器资源放到一个资源组中. 这样并发调度能够使用多个应用服务器的资源.图四的资源组 390 包含了多台应用服务器的资源

003a81be66991a102b2465d82b683e32.png

图四


并发调用注意事项

01

数据切分

可以把确定数据切分的内容放到内表中循环,循环中读取其它所需的数据通过入参传递到RFC函数中处理,也可以在函数中根据传入的关键字,自行获取数据进行处理.

02

初始化服务器组

可以通过函数SPBT_INITIALIZE 初始化服务器组,检查当前服务器组的可用资源是否能够满足用户输入的最大进程数,如果不满足,报错或者调整最大进程数, 避免出现资源错误.

6dbef6449e981cda5587b034fbddf189.png

03

每个进程调度前检查

每个进程调度的时候,检查一下系统是否有空闲进程, 并等待系统有空闲资源后,再CALL ARFC调度进程.

避免并发调用因为没有空闲进程而失败

b48823ff783687ce9344f55629320438.png

04

控制变量

  • SND_JOBS :用于统计已经发送的任务数

  • RCV_JOBS :用于统计回调模块接收的任务数

  • RUN_JOBS: 用于统计正在运行的任务数

d552d12bf67d5d2fbb54a57b3e602d85.png

调用后追加发出数和执行数

70d5b21f6217ba6995a693b22d6d6ef4.png

循环中 等待并检查执行必须小于最大运行数,

循环后 等待并检查所有发出的任务都已经接收到结果.(如果回调失败导致 RCV_JOBS没有增加,可能会导致程序一致等待,实际应用中该问题基本不会出现).

bc91cd8f150d20e0f707770eb9104cde.png

回调中追加接收任务数,减少运行任务数

f519b7a40c1dfccc711d274f75d5e72a.png

05

通过任务ID识别

ARFC调用时传递的任务ID和回调例程返回的任务ID一致,用于识别每个任务的执行情况, 需要强调的是:分配的任务ID一定不能重复.

  • PERFORM 的回调参数名固定为 name

  • CALL METHOD 的回调参数名固定为 P_TASK

de8e60b24e1afd0378b6200a1ace3a45.png

782ffbfce12f6f5abbc8d97b04c94bbd.png

06

统计任务执行

通过内表采集所有任务的运行情况

调用前把任务ID写入内表, 回调后读取任务ID内表,写入回调成功信息. 可以在任务内表中加入容易识别的数据分割关键字.最后通过该内表判断处理情况, 对于失败的任务,可以通过关键字识别后,发起重新调度.

实际也可以用这个内表采集的情况作为并发调度的控制信息. 用在循环末的等待中. 

总结

并发调度使用了ARFC功能调用,因此并发调度的逻辑必须写入到一个RFC函数中. 暂时没有找到类方法的并发调度方式, 估计只能把类的调用封装在RFC函数中实现.

并发调度的实现比较简单,只需要注意文中的一些事项,即可实现比较完善的并发调度逻辑. 

上述注意事项来自一个标准并发调度程序的跟踪,相对靠谱. 当然也可以根据基本原理写一些不同的并发控制逻辑.

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值