程序优化 - ABAP并行处理

news2024/11/20 6:30:50

SAP的并行方式有很多种:

  • SPTA框架,参考debug可以看出这个核心也是异步bgRFC
    在这里插入图片描述

  • 异步RFC,使用CALL FUNCTION “XXXXXX” STARTING NEW TASK XXXX CALLING XXXX ON END OF TASK

  • BANK_PP_JOBCTRL框架

  • 拆分成多个后台JOB执行

这里只说SPTA框架,既然是框架就一定已经实现的基础功能,我们只需要在框架中加入要实现的逻辑和配置一些参数就可以实现多线程并行处理。

优化实例

下面是一个项目中的优化实例:
背景:整车接口,包含几块主要逻辑,
Step1 创建物料主数据-MM01
Step2 修改特性值-MM02
Step3 关联SBOM-CS40
Step4 分配工艺路线-CA02
Step5 创建生产版本-C223
每一辆车的VMC号接口过来都要走这几步,原接口程序的逻辑就是循环串行执行。

比如一共100个VMC,逻辑运行过程就是:
12345
12345

12345
12345,
如此执行100次。
在这里插入图片描述
耗时非常长,导致在数据量大时,JOB要执行一整晚,会影响到其它JOB的执行。

优化过程

有几点考虑:

  1. step1 和step2分别是对物料的操作,不同的VMC之间不存在互锁,所以可以用并行处理
  2. step3关联的是同一个super BOM,只能顺序执行
  3. step4有函数可以实现批量分配,也就是一次执行可以处理所有数据
  4. step5不同VMC之间不存在互锁,也可以并行处理

所以优化后的逻辑是:
5. 将step1和step2放到一个form里进行并行处理。
6. 上一步全部数据处理完成后成功的数据进入Step3, 循环处理
7. 上一步全部数据处理完成后成功的数据进入Step4,一次执行全部数据
8. 上一步处理完成后成功的数据进行并行处理。

所以优化后整个过程是:
12 12 12 12 12 12 12 12 12 12(始终保持10个进程在处理前两步)

3

4
4

4
4

5 5 5 5 5 5 5 5 5 5(始终保持10个进程在处理step5)

大概是这个意思:
在这里插入图片描述

优化前后的数据对比(72台车,相同数据):
在这里插入图片描述
时间是原来的1/50。

主要代码:

**********************************************************************
*step 1 + 2 Parallel process
**********************************************************************
* 使用SPTA框架拆包进行多进程处理
* BEFORE_RFC: 拆包FORM
* IN_RFC:     拆包后执行此FORM,将逻辑打包到这个form里
* AFTER_RFC:  IN_RFC执行完调用此FORM,用来收集执行结果
**********************************************************************


  "参数准备

  CALL 'C_SAPGPARAM'                                      "#EC CI_CCALL
     ID 'NAME'  FIELD 'rdisp/myname'
     ID 'VALUE' FIELD lv_sergroup.
  SELECT SINGLE classname
    INTO lv_rfcgroup
    FROM rzllitab
    WHERE grouptype = 'S'
      AND applserver = lv_sergroup.
  IF sy-subrc <> 0.
    MESSAGE 'Server Group Read Error. Contact Administrator.' TYPE 'E'.
  ENDIF.

  lv_repid = sy-repid.

  IF p_max > 0.
    lv_maxtasks = p_max.
  ELSE.
    lv_maxtasks = 10.
  ENDIF.


  LOOP AT gt_data INTO DATA(ls_data) WHERE mtype <> 'E'.
    DATA(lv_tabix) = sy-tabix.
    APPEND ls_data TO lt_data.
    DELETE gt_data INDEX lv_tabix.
  ENDLOOP.

  IF lt_data[] IS NOT INITIAL.
    CALL FUNCTION 'SPTA_PARA_PROCESS_START_2'
      EXPORTING
        server_group             = lv_rfcgroup " SERVER_GROUP created from RZ12
        max_no_of_tasks          = lv_maxtasks "最大进程数
        before_rfc_callback_form = 'BEFORE_RFC'
        in_rfc_callback_form     = 'IN_RFC'
        after_rfc_callback_form  = 'AFTER_RFC'
        callback_prog            = lv_repid
*       SHOW_STATUS              = ' '
*       RESOURCE_TIMEOUT         = 600
*       TASK_CALL_MODE           = 1
      CHANGING
        user_param               = lt_data
      EXCEPTIONS
        invalid_server_group     = 1
        no_resources_available   = 2
        OTHERS                   = 3.
    IF sy-subrc <> 0.
      MESSAGE 'Error. Contact Administrator.' TYPE 'E'.
    ENDIF.


    "将前两步处理的结果再汇总到GT_DATA
    APPEND LINES OF gt_final TO gt_data.
  ENDIF.
**********************************************************************
**step3: cs40 LINK SBOM
**********************************************************************
  CLEAR lt_data.
  CLEAR gt_final.
  LOOP AT gt_data INTO ls_data WHERE mtype <> 'E' AND zzt = '2'.
    lv_tabix = sy-tabix.
    APPEND ls_data TO lt_data.
    DELETE gt_data INDEX lv_tabix.
  ENDLOOP.

  IF lt_data IS NOT INITIAL.
    PERFORM frm_cs40_batch TABLES lt_data.
    APPEND LINES OF lt_data TO gt_data.
  ENDIF.


**********************************************************************
**step4: CA02
**********************************************************************

  LOOP AT gt_data INTO ls_data WHERE mtype <> 'E' AND zzt = '3'.
    lv_tabix = sy-tabix.
    CLEAR lv_subrc.
    CLEAR lv_str.
*& 4. assign routing
"    MOVE-CORRESPONDING ls_data TO ls_ca02.
    MOVE-CORRESPONDING ls_data TO it_data.
    PERFORM frm_assign_routing USING it_data CHANGING lv_subrc lv_str.
    IF lv_subrc <> 0.
      ls_data-icon  = gc_red.
      ls_data-zzt   = 'E'."数据不完整
      ls_data-mtype = /sapmp/if_char_1=>ce.
      CONCATENATE ls_data-msg lv_str INTO ls_data-msg. "分配工艺路线失败:
      MODIFY gt_data FROM ls_data INDEX lv_tabix.
      CONTINUE.
    ELSE.
      ls_data-zzt = '4'."分配工艺路线成功
      MODIFY gt_data FROM ls_data INDEX lv_tabix.
    ENDIF.
  ENDLOOP.
**********************************************************************
**step5: C223
**********************************************************************
* 使用SPTA框架拆包进行多进程处理
* BEFORE_RFC: 拆包FORM
* IN_RFC_C223:     拆包后执行此FORM,将逻辑打包到这个form里
* AFTER_RFC:  IN_RFC执行完调用此FORM,用来收集执行结果
**********************************************************************
  CLEAR lt_data.
  CLEAR gt_final.
  LOOP AT gt_data INTO ls_data WHERE mtype <> 'E' AND zzt = '4'.
    lv_tabix = sy-tabix.
    APPEND ls_data TO lt_data.
    DELETE gt_data INDEX lv_tabix.
  ENDLOOP.

  IF lt_data[] IS NOT INITIAL.
    CALL FUNCTION 'SPTA_PARA_PROCESS_START_2'
      EXPORTING
        server_group             = lv_rfcgroup " SERVER_GROUP created from RZ12
        max_no_of_tasks          = lv_maxtasks "最大进程数
        before_rfc_callback_form = 'BEFORE_RFC'
        in_rfc_callback_form     = 'IN_RFC_C223'
        after_rfc_callback_form  = 'AFTER_RFC'
        callback_prog            = lv_repid
*       SHOW_STATUS              = ' '
*       RESOURCE_TIMEOUT         = 600
*       TASK_CALL_MODE           = 1
      CHANGING
        user_param               = lt_data
      EXCEPTIONS
        invalid_server_group     = 1
        no_resources_available   = 2
        OTHERS                   = 3.
    IF sy-subrc <> 0.
      MESSAGE 'Error. Contact Administrator.' TYPE 'E'.
    ENDIF.

    "将前两步处理的结果再汇总到GT_DATA
    APPEND LINES OF gt_final TO gt_data.
  ENDIF.

FORM before_rfc     USING  p_before_rfc_imp     TYPE spta_t_before_rfc_imp
   CHANGING
      p_before_rfc_exp     TYPE spta_t_before_rfc_exp
      pt_rfcdata           TYPE spta_t_indxtab
      p_failed_objects     TYPE spta_t_failed_objects
      p_objects_in_process TYPE spta_t_objects_in_process
      p_user_param .
  DATA: ld_task_data      TYPE t_rfcdata,
        ld_obj_in_process LIKE LINE OF p_objects_in_process.

  DATA:1_counter     TYPE i,
       1_no_of_items TYPE i,
       lt_data       TYPE STANDARD TABLE OF yvms_parallel_s,
       lt_package    TYPE yvms_parallel_t,
       wa_data       TYPE yvms_parallel_s.
*定义一个Package size,比如10,如果总数据量为65,屏幕输入max 进程为3,则会先开3个进程,处理前30条数据,每结束一个进行再新开一个进程
*处理下一个10条,始终保持开最多3个进程

  CLEAR ld_obj_in_process.
  lt_data = p_user_param.
*Create small work packets for parallel processing
  1_no_of_items = 10.
  "One work packet vill contain 10 records
  LOOP AT lt_data INTO wa_data.
*Read and move specified number of records
    IF ( 1_counter < 1_no_of_items  AND wa_data IS NOT INITIAL ).
      APPEND wa_data TO lt_package.
      DELETE lt_data INDEX 1.
      1_counter = 1_counter + 1.
    ELSE.
      EXIT.
    ENDIF.
  ENDLOOP.
  p_user_param = lt_data.
  IF lt_package IS INITIAL.
    CLEAR p_before_rfc_exp-start_rfc.
    EXIT.
  ENDIF.

* Convert the input data into the INDX structure that is needed for the RFC
  CALL FUNCTION 'SPTA_INDX_PACKAGE_ENCODE'
    EXPORTING
      data    = lt_package
    IMPORTING
      indxtab = pt_rfcdata.

* Inform task manager that an RFC can be started from the
* data compiled
  p_before_rfc_exp-start_rfc = 'X'.
ENDFORM.
FORM in_rfc
        USING    is_in_rfc_imp TYPE spta_t_in_rfc_imp
        CHANGING es_in_rfc_exp TYPE spta_t_in_rfc_exp
                 it_rfcdata    TYPE spta_t_indxtab.
  DATA: lt_package TYPE yvms_parallel_t.

* decode the data from the INDX Structure into the process work list
  CALL FUNCTION 'SPTA_INDX_PACKAGE_DECODE'
    EXPORTING
      indxtab = it_rfcdata
    IMPORTING
      data    = lt_package.

* repack output data for AFTER_RFC form
  PERFORM frm_package_process TABLES lt_package.

  CALL FUNCTION 'SPTA_INDX_PACKAGE_ENCODE'
    EXPORTING
      data    = lt_package
    IMPORTING
      indxtab = it_rfcdata.
  COMMIT WORK.

ENDFORM.
FORM in_rfc_c223
        USING    is_in_rfc_imp TYPE spta_t_in_rfc_imp
        CHANGING es_in_rfc_exp TYPE spta_t_in_rfc_exp
                 it_rfcdata    TYPE spta_t_indxtab.
  DATA: lt_package TYPE yvms_parallel_t.

* decode the data from the INDX Structure into the process work list
  CALL FUNCTION 'SPTA_INDX_PACKAGE_DECODE'
    EXPORTING
      indxtab = it_rfcdata
    IMPORTING
      data    = lt_package.

* repack output data for AFTER_RFC form
  PERFORM frm_package_process_c223 TABLES lt_package.

  CALL FUNCTION 'SPTA_INDX_PACKAGE_ENCODE'
    EXPORTING
      data    = lt_package
    IMPORTING
      indxtab = it_rfcdata.
  COMMIT WORK.

ENDFORM.

FORM after_rfc USING it_rfcdata  TYPE spta_t_indxtab
                     if_rfcsubrc TYPE sy-subrc
                     if_rfcmsg   TYPE spta_t_rfcmsg
                     it_objects_in_process TYPE spta_t_objects_in_process
                     is_after_rfc_imp      TYPE spta_t_after_rfc_imp
            CHANGING es_after_rfc_exp TYPE spta_t_after_rfc_exp
                     cs_user_param    TYPE yvms_parallel_t.

  DATA: lt_final  TYPE yvms_parallel_t.
* uppack RFC output data and add RFC reulsts to global data
  CALL FUNCTION 'SPTA_INDX_PACKAGE_DECODE'
    EXPORTING
      indxtab = it_rfcdata
    IMPORTING
      data    = lt_final.

  APPEND LINES OF lt_final TO gt_final.

ENDFORM.

有了框架,程序变得很简单也很清楚,我们只需要重点关注in_rfc_callback_form这个回调form ‘IN_RFC’和’IN_RFC_C223‘(因为我两次使用了并行,这里分开做了处理,其实写到一起也是可以的)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/562513.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【高危】Linux Kernel OverlayFS 权限提升漏洞(POC公开)

漏洞描述 Linux Kernel OverlayFS 是 Linux 内核提供的一种文件系统&#xff0c;允许将多个文件系统合并为一个单一的虚拟文件系统。 在 Linux Kernel OverlayFS 受影响版本中&#xff0c;当用户将具备特权的文件从 nosuid 的挂载点复制到另一个挂载点时&#xff0c;未授权的…

【严重】ejs 存在服务端模板注入漏洞(存在POC)

漏洞描述 EJS 是开源的 JavaScript 模板引擎&#xff0c;允许在HTML代码中使用JavaScript代码块&#xff0c;closeDelimiter 参数是 EJS 模板中的结束标记&#xff0c;用于指定结束分隔符。 由于对 CVE-2022-29078 漏洞修复不完全&#xff0c;当应用程序使用 EJS 模板引擎&am…

如何恢复已删除或丢失的音乐文件

您是否遇到过您或其他人不小心删除了您的音乐文件的情况&#xff1f;作为我自己的音乐爱好者&#xff0c;我知道这种感觉有多么毁灭性。听音乐让我们平静和放松&#xff0c;它可以帮助一些人在工作时提高工作效率或缓解他们感受到的压力。 这就是为什么如果您不小心丢失了您心…

springcloud-alibaba (04)Gateway与Nacos结合使用

Gateway与Nacos结合使用 &#x1f389;欢迎来到这里&#xff0c;今天我将为大家介绍如何将Spring Cloud Gateway和Nacos结合使用&#xff0c;实现一个高效稳定的服务网关&#xff01;在微服务架构中&#xff0c;API网关是必不可少的一部分&#xff0c;它提供了路由请求、负载均…

java版企业工程项目管理系统源代码-功能清单 图文解析

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示…

新手如何写新闻稿?一文带你了解记者稿的写作步骤与技巧

作为一名新手记者&#xff0c;写稿件是必须掌握的基本技能。记者稿的写作方式有很多种&#xff0c;但基本的步骤和技巧是相同的。在这篇文章中&#xff0c;我将向大家介绍记者稿的写作步骤和技巧&#xff0c;希望能对想要成为一名优秀记者的你有所帮助。 一、确定新闻价值 在写…

代码随想录训练营Day50| 123.买卖股票的最佳时机III 188.买卖股票的最佳时机IV

目录 学习目标 学习内容 123.买卖股票的最佳时机III 188.买卖股票的最佳时机IV 学习目标 123.买卖股票的最佳时机III 188.买卖股票的最佳时机IV 学习内容 123.买卖股票的最佳时机III 123. 买卖股票的最佳时机 III - 力扣&#xff08;LeetCode&#xff09;https://lee…

深度分析:智能照明百亿赛道,Yeelight易来如何做到智能照明和定制照明双C位

日前&#xff0c;艾瑞咨询发布了《2023年中国家用智能照明行业研究报告》&#xff0c;报告显示&#xff0c;中国家用智能照明市场迎来爆发式增长&#xff0c;市场占有率从2016年仅2.0%上升到2022年的20.4%&#xff0c;7年间占比增长20%。预计2023年家用智能照明市场规模将突破1…

千呼万唤始出来!从源码到架构的Spring全系列笔记,已全部分享

因粉丝强烈要求小编整理一套spring全系列资料集合&#xff0c;不然就要集体给小编寄刀片了&#xff0c;今天终于是千呼万唤始出来&#xff0c;给大家连夜整理这一套可以说是全网最全最细的Spring全系列资料&#xff0c;今天毫无保留的给大家分享出来一起学习&#xff01;一起牛…

【JavaSE】Java基础语法(七):二维数组

文章目录 &#x1fa82;1. 二维数组概述&#x1fa82;2. 二维数组动态初始化&#x1fa82;3. 二维数组访问元素的细节问题&#x1fa82;4. 二维数组静态初始化&#x1fa82;5. 二维数组遍历&#x1fa82;6. 二维数组求和 &#x1fa82;1. 二维数组概述 概述 : 二维数组也是一种…

数据库范式理论

目录 1、1NF 2、2NF 3、3NF 4、BCNF 5、4NF 1、1NF 在实际应用中&#xff0c;数据库表的每一列&#xff08;也称为属性&#xff09;都是不可分割的原子数据项&#xff0c;不能是集合&#xff0c;数组&#xff0c;记录等非原子数据项。即在实际应用中实体中的某个属性有多个…

直播电商迈入新周期,快手如何抢跑?

文 | 螳螂观察 作者 | 图霖 直播电商迈入第七个发展年头&#xff0c;来到了新周期的变革前夜。 行业竞争逐年加剧&#xff0c;但截至2022年已迅速攀升至35000亿元的直播电商市场交易规模&#xff0c;仍诱惑着新玩家挤进这张拥堵的牌桌。 美团方面&#xff0c;继今年1月底在…

局域网唤醒工具UpSnap

什么是 UpSnap &#xff1f; UpSnap 是使用 SvelteKit、Go、PocketBase 和 nmap 编写的简单局域网唤醒应用程序。 v3 更新日志&#xff1a; ⚙️ 后端&#xff1a; 用 Go 重写。之前的版本是 Python 写的&#xff1b;不再支持不同的数据库。后端现在使用基于 SQLite 的 PocketB…

Qt+QtWebApp开发笔记(三):http服务器动态html连接跳转基础交互

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/130840894 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

电脑密码忘了怎么解除?试试这3个方法!

案例&#xff1a;我的电脑太久没有使用&#xff0c;导致我忘记了密码&#xff0c;试了好几次还是显示密码错误。怎样才能找回电脑的开机密码&#xff1f; 【我忘记了电脑密码&#xff0c;导致我无法使用电脑&#xff0c;给我的生活带来了很大的困扰。有没有小伙伴遇到过相同的…

开发最佳实践|集成声网 iOS SDK,实现语音聊天室

大家好&#xff0c;我是声网 RTE 开发者社区作者 小曾同学。本次主要分享集成声网SDK实现语音聊天室。 01 前言 在日常生活中经常会看到一些聊天场景&#xff0c;比如在线KTV、连麦开黑、多人相亲、娱乐聊天室等应用场景&#xff0c;随着移动应用开发的需求不断增加&#xff…

提高记忆力的 10 种记忆技巧和工具

人工智能的迅速发展&#xff0c;让人不禁猜想是否有一天我们也能靠AI来提高自己的记忆力&#xff1f;哈哈也许真的可行&#x1f916; 其实现在已经有很多记忆技巧和工具&#xff0c;不仅可以帮助我们存储信息&#xff0c;还可以更好地回忆和记忆更大的信息集。 实际上&#x…

lwIP更新记07:TCP 控制块申请失败可以检测到了

从 lwIP-2.0.0 开始&#xff0c;TCP 控制块申请失败可以检测到了。 这个更新应用在 TCP 服务器模式中&#xff0c;处于监听状态的 TCP_PCB &#xff0c;如果收到客户端发送的 SYN 同步标志&#xff0c;表示一个客户端在请求建立连接了。lwIP 会为这个新连接申请一个 TCP_PCB &…

APP启动页和闪屏的知识点

APP启动页和闪屏的知识点_51CTO博客_app启动屏广告 启动页与闪屏的区别 1.启动页 (launch screen ) 当app被用户打开时,在app启动过程中被用户所看到的过渡页面(或动画)都被我们统称为启动页。 优点&#xff1a; 1.打开一个产品时&#xff0c;需要有一定的时间加载&#xff…

windows sever服务器安装系统新手版

混在learnsite群里已经有几年了吧&#xff0c;但是只有一段时间用了别人现成的一个iso版本还比较老&#xff0c;这次打算自己弄一个&#xff0c;一开始打算linux下弄&#xff0c;结果系统都装完了发现人家说learnsite在linux下有点bug没解决好&#xff0c;只能win下再弄&#x…