SAP 设置分批取数,多线程处理数据

简介: 多线程处理数据

REPORT  z_archive_test.

DATA: taskname(10) TYPE n VALUE '1',"Task name administration

     snd_jobs    TYPE i VALUE 0,"Sent jobs

     rcv_jobs    TYPE i VALUE 0,"Received replies

      wa_indx    TYPE indx.

DATA: gt_log TYPE zesp1_message_tab_type_test WITH HEADER LINE.

SELECTION-SCREEN BEGIN OF BLOCK bl00 WITH FRAME TITLE text-000.

PARAMETERS: p_datum  LIKE sy-datum OBLIGATORY DEFAULT sy-datum,"归档时间点

           p_thrcnt LIKE sy-tabix OBLIGATORY DEFAULT 100,"每个线程处理数据记录条数

           p_maxcnt LIKE sy-tabix DEFAULT 1000."总共读取数据条数

SELECTION-SCREEN END OF BLOCK bl00.

START-OF-SELECTION.

CALL FUNCTION 'SPBT_INITIALIZE'

    EXPORTING

      group_name                           = serv_group"可不填

*     IMPORTING

*       MAX_PBT_WPS                          = 最大线程数

*       FREE_PBT_WPS                         = 空闲线程数

    EXCEPTIONS

      invalid_group_name                   = 1

      internal_error                       = 2

      pbt_env_already_initialized          = 3

      currently_no_resources_avail         = 4

      no_pbt_resources_found               = 5

      cant_init_different_pbt_groups       = 6

      OTHERS                               = 7

           .  

 PERFORM frm_do_it.

*&---------------------------------------------------------------------*

*&      Form  frm_do_it

*&---------------------------------------------------------------------*

*       分批取数 多线程数据处理

*----------------------------------------------------------------------*

FORM frm_do_it.

 DATA: ekko_cursor TYPE cursor,

       lt_ekko TYPE TABLE OF ekko.

 OPEN CURSOR WITH HOLD ekko_cursor FOR

     SELECT *

     UP TO p_maxcnt ROWS

     FROM ekko

     WHERE ekko~aedat <= p_datum .

 DO.

   FETCH NEXT CURSOR  ekko_cursor

          INTO TABLE  lt_ekko

        PACKAGE SIZE  p_thrcnt."阀值

   IF sy-subrc NE 0.

     EXIT.

   ENDIF.

   IF LINES( lt_ekko ) <> 0.

     DO.

       CALL FUNCTION 'ZARCHIVE_EKKO_TEST'     "Make the FM as RFC enabled.

         STARTING NEW TASK taskname

         DESTINATION IN GROUP DEFAULT

         PERFORMING frm_reveive_result ON END OF TASK

         EXPORTING

           taskname         = taskname

         TABLES

           it_ekko          = lt_ekko

         EXCEPTIONS

           resource_failure = 1

           OTHERS           = 2.

       IF sy-subrc = 0.

         snd_jobs = snd_jobs + 1.

         EXIT.

       ELSE.

         WAIT UNTIL rcv_jobs = snd_jobs.

       ENDIF.

       "如果1000次尝试还没有成功,即放弃

       IF sy-index > 1000.

         EXIT.

       ENDIF.

     ENDDO.

     taskname = taskname + 1.

   ELSE.

     MESSAGE '未找到指定选择的数据' TYPE 'S'.

     STOP.

     "EXIT.

   ENDIF.

 ENDDO.

 CLOSE CURSOR  ekko_cursor.

 WAIT UNTIL rcv_jobs = snd_jobs."执行完成,统计结果

 LOOP AT gt_log.

   gt_log-lineno = sy-tabix.

   MODIFY gt_log.

 ENDLOOP.

 CALL FUNCTION 'C14Z_MESSAGES_SHOW_AS_POPUP'

   TABLES

     i_message_tab = gt_log.

ENDFORM.                    "frm_do_it

*&---------------------------------------------------------------------*

*&      Form  frm_reveive_result

*&---------------------------------------------------------------------*

*       接收现成执行结果

*----------------------------------------------------------------------*

FORM frm_reveive_result USING taskname.

 DATA: lt_log TYPE zesp1_message_tab_type_test.

 RECEIVE RESULTS

 FROM FUNCTION 'ZARCHIVE_EKKO_TEST'

   IMPORTING

     et_log  = lt_log.

 "如果接收不成功,则使程序dump掉

 IF sy-subrc <> 0.

 ENDIF.

 rcv_jobs = rcv_jobs + 1.  "Receiving data

 APPEND LINES OF lt_log TO gt_log.

 REFRESH lt_log.

ENDFORM.                    "frm_reveive_result

***********************************************************************

***********************************************************************

***********************************************************************

***********************************************************************

FUNCTION zarchive_ekko_test.

*"----------------------------------------------------------------------

*"*"Local interface:

*"  IMPORTING

*"     VALUE(TASKNAME) TYPE  CHAR10

*"  EXPORTING

*"     VALUE(ET_LOG) TYPE  ZESP1_MESSAGE_TAB_TYPE_TEST

*"  TABLES

*"      IT_EKKO STRUCTURE  EKKO

*"----------------------------------------------------------------------

 DATA: wa_log TYPE zesp1_message_wa_type_test.

 wa_log-msgid = 'ZFI'.

 wa_log-msgty = 'S'.

 wa_log-msgno = '000'.

 CONCATENATE taskname '任务开始' INTO wa_log-msgv1.

 APPEND wa_log TO et_log.

ENDFUNCTION.

目录
相关文章
|
9月前
|
数据采集 监控 调度
干货分享“用 多线程 爬取数据”:单线程 + 协程的效率反超 3 倍,这才是 Python 异步的正确打开方式
在 Python 爬虫中,多线程因 GIL 和切换开销效率低下,而协程通过用户态调度实现高并发,大幅提升爬取效率。本文详解协程原理、实战对比多线程性能,并提供最佳实践,助你掌握异步爬虫核心技术。
|
9月前
|
Java 索引
多线程向设备发送数据
多线程向设备发送数据
150 0
|
11月前
|
Kubernetes Linux Go
使用 Uber automaxprocs 正确设置 Go 程序线程数
`automaxprocs` 包就是专门用来解决此问题的,并且用法非常简单,只需要使用匿名导入的方式 `import _ "go.uber.org/automaxprocs"` 一行代码即可搞定。
460 78
|
数据采集 存储 安全
Python爬虫实战:利用短效代理IP爬取京东母婴纸尿裤数据,多线程池并行处理方案详解
本文分享了一套结合青果网络短效代理IP和多线程池技术的电商数据爬取方案,针对京东母婴纸尿裤类目商品信息进行高效采集。通过动态代理IP规避访问限制,利用多线程提升抓取效率,同时确保数据采集的安全性和合法性。方案详细介绍了爬虫开发步骤、网页结构分析及代码实现,适用于大规模电商数据采集场景。
|
SQL 数据建模 BI
【YashanDB 知识库】用 yasldr 配置 Bulkload 模式作单线程迁移 300G 的业务数据到分布式数据库,迁移任务频繁出错
问题描述 详细版本:YashanDB Server Enterprise Edition Release 23.2.4.100 x86_64 6db1237 影响范围: 离线数据迁移场景,影响业务数据入库。 外场将部分 NewCIS 的报表业务放到分布式数据库,验证 SQL 性能水平。 操作系统环境配置: 125G 内存 32C CPU 2T 的 HDD 磁盘 问题出现的步骤/操作: 1、部署崖山分布式数据库 1mm 1cn 3dn 单线启动 yasldr 数据迁移任务,设置 32 线程的 bulk load 模式 2、观察 yasldr.log 是否出现如下错
|
缓存 安全 Java
面试中的难题:线程异步执行后如何共享数据?
本文通过一个面试故事,详细讲解了Java中线程内部开启异步操作后如何安全地共享数据。介绍了异步操作的基本概念及常见实现方式(如CompletableFuture、ExecutorService),并重点探讨了volatile关键字、CountDownLatch和CompletableFuture等工具在线程间数据共享中的应用,帮助读者理解线程安全和内存可见性问题。通过这些方法,可以有效解决多线程环境下的数据共享挑战,提升编程效率和代码健壮性。
422 6
|
监控 Java
线程池大小如何设置
在并发编程中,线程池是一个非常重要的组件,它不仅能够提高程序的响应速度,还能有效地利用系统资源。合理设置线程池的大小对于优化系统性能至关重要。本文将探讨如何根据应用场景和系统资源来设置线程池的大小。
|
消息中间件 监控 Java
线程池关闭时未完成的任务如何保证数据的一致性?
保证线程池关闭时未完成任务的数据一致性需要综合运用多种方法和机制。通过备份与恢复、事务管理、任务状态记录与恢复、数据同步与协调、错误处理与补偿、监控与预警等手段的结合,以及结合具体业务场景进行分析和制定策略,能够最大程度地确保数据的一致性,保障系统的稳定运行和业务的顺利开展。同时,不断地优化和改进这些方法和机制,也是提高系统性能和可靠性的重要途径。
385 62
|
缓存 安全 Java
使用 Java 内存模型解决多线程中的数据竞争问题
【10月更文挑战第11天】在 Java 多线程编程中,数据竞争是一个常见问题。通过使用 `synchronized` 关键字、`volatile` 关键字、原子类、显式锁、避免共享可变数据、合理设计数据结构、遵循线程安全原则和使用线程池等方法,可以有效解决数据竞争问题,确保程序的正确性和稳定性。
412 57