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.

目录
相关文章
|
2月前
|
消息中间件 监控 安全
服务Down机了,线程池中的数据如何保证不丢失?
在分布式系统与高并发应用开发中,服务的稳定性和数据的持久性是两个至关重要的考量点。当服务遭遇Down机时,如何确保线程池中处理的数据不丢失,是每一位开发者都需要深入思考的问题。以下,我将从几个关键方面分享如何在这种情况下保障数据的安全与完整性。
65 2
|
4月前
|
SQL druid Java
线程池相关故障问题之Druid数据库连接池中,为何需要设置TransactionTimeout
线程池相关故障问题之Druid数据库连接池中,为何需要设置TransactionTimeout
128 0
|
1月前
|
缓存 安全 Java
使用 Java 内存模型解决多线程中的数据竞争问题
【10月更文挑战第11天】在 Java 多线程编程中,数据竞争是一个常见问题。通过使用 `synchronized` 关键字、`volatile` 关键字、原子类、显式锁、避免共享可变数据、合理设计数据结构、遵循线程安全原则和使用线程池等方法,可以有效解决数据竞争问题,确保程序的正确性和稳定性。
36 2
|
2月前
|
Java Spring
spring多线程实现+合理设置最大线程数和核心线程数
本文介绍了手动设置线程池时的最大线程数和核心线程数配置方法,建议根据CPU核数及程序类型(CPU密集型或IO密集型)来合理设定。对于IO密集型,核心线程数设为CPU核数的两倍;CPU密集型则设为CPU核数加一。此外,还讨论了`maxPoolSize`、`keepAliveTime`、`allowCoreThreadTimeout`和`queueCapacity`等参数的设置策略,以确保线程池高效稳定运行。
237 10
spring多线程实现+合理设置最大线程数和核心线程数
|
1月前
|
Java
线程池设置原则
线程池设置原则
|
6月前
|
消息中间件 Java Kafka
实时计算 Flink版操作报错之Apache Flink中的SplitFetcher线程在读取数据时遇到了未预期的情况,该怎么解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
2月前
|
消息中间件 存储 Java
服务重启了,如何保证线程池中的数据不丢失?
【8月更文挑战第30天】为确保服务重启时线程池数据不丢失,可采用数据持久化(如数据库或文件存储)、使用可靠的任务队列(如消息队列或分布式任务队列系统)、状态监测与恢复机制,以及分布式锁等方式。这些方法能有效提高系统稳定性和可靠性,需根据具体需求选择合适方案并进行测试优化。
190 5
|
3月前
处理串口线程数据的函数
【8月更文挑战第4天】处理串口线程数据的函数。
27 4
|
3月前
|
数据处理 Python
解锁Python多线程编程魔法,告别漫长等待!让数据下载如飞,感受科技带来的速度与激情!
【8月更文挑战第22天】Python以简洁的语法和强大的库支持在多个领域大放异彩。尽管存在全局解释器锁(GIL),Python仍提供多线程支持,尤其适用于I/O密集型任务。通过一个多线程下载数据的例子,展示了如何使用`threading`模块创建多线程程序,并与单线程版本进行了性能对比。实验表明,多线程能显著减少总等待时间,但在CPU密集型任务上GIL可能会限制其性能提升。此案例帮助理解Python多线程的优势及其适用场景。
39 0
|
3月前
|
NoSQL Redis
Lettuce的特性和内部实现问题之在同步调用模式下,业务线程是如何拿到结果数据的
Lettuce的特性和内部实现问题之在同步调用模式下,业务线程是如何拿到结果数据的