ABAP并发执行函数 异步RFC

在ABAP中实现并发就是调用异步RFC函数,可以同事执行多个函数模块而不需要等待按顺序执行,具体代码在本文的最后

实现效果:
ABAP并发执行函数 异步RFC_第1张图片

首先定义一个RFC函数:

ABAP并发执行函数 异步RFC_第2张图片

FUNCTION ZRFC_THREAD_TEST.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(IV_TASK_ID) TYPE  I
*"  EXPORTING
*"     VALUE(EV_TASK_NAME) TYPE  STRING
*"----------------------------------------------------------------------
  DATA:LV_TASK_ID TYPE STRING.
  LV_TASK_ID = IV_TASK_ID.
  WAIT UP TO 2 SECONDS.			"模拟运行时间2s
  CONCATENATE 'TASK ' `   ` LV_TASK_ID `   `  'HAS RUN!' INTO EV_TASK_NAME.

ENDFUNCTION.

重要代码:

CALL FUNCTION 'ZRFC_THREAD_TEST'
      STARTING NEW TASK TASK_NAME     "可以理解为线程名为
      DESTINATION IN GROUP DEFAULT    "调用系统 DEFAULT为当前系统
      PERFORMING FRM_CALLBACK ON END OF TASK "在这个TASK结束后接着执行的FORM名为 FRM_CALLBACK
      EXPORTING
        IV_TASK_ID            = GV_INDEX
      EXCEPTIONS
        SYSTEM_FAILURE        = 1 MESSAGE MESS		"系统错误
        COMMUNICATION_FAILURE = 2 MESSAGE MESS		"通信错误
        RESOURCE_FAILURE      = 3.				   "资源错误
        
        ...
        
FORM FRM_CALLBACK USING TASK_NAME.
  DATA:LV_TASK_NAME TYPE STRING.
  RECEIVE RESULTS FROM FUNCTION 'ZRFC_THREAD_TEST'
   IMPORTING
     EV_TASK_NAME = LV_TASK_NAME.    "得到函数ZRFC_THREAD_TEST的输出值
  ...
ENDFORM.

本文模拟了30次调用函数,每次执行会花费2s时间,如果不用并发执行,按照以下代码块依次执行30次则会花费超过30 * 2 = 60s的时间,本次具体花费时间约为60.32s

DATA:GT_DATA TYPE TABLE OF STRING.
DATA:GV_TASK_NAME TYPE STRING.
DO 30 TIMES.
  CALL FUNCTION 'ZRFC_THREAD_TEST'
    EXPORTING
      IV_TASK_ID   = SY-INDEX
    IMPORTING
      EV_TASK_NAME = GV_TASK_NAME.
  APPEND GV_TASK_NAME TO GT_DATA.
  CLEAR GV_TASK_NAME.
ENDDO.
CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( GT_DATA ).

ABAP并发执行函数 异步RFC_第3张图片

如果通过并发的方式执行函数,即同时执行30个函数,花费的时间约为2.38s

ABAP并发执行函数 异步RFC_第4张图片

这里可以明显感觉到并发的执行效率远远优于非并发执行,这里的性能比超过了30

当然,其实也不是所有的情况下使用并发效率都优于非并发,接下来我们将RFC函数中的模拟运行时间去掉,如下:

FUNCTION ZRFC_THREAD_TEST.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(IV_TASK_ID) TYPE  I
*"  EXPORTING
*"     VALUE(EV_TASK_NAME) TYPE  STRING
*"----------------------------------------------------------------------
  DATA:LV_TASK_ID TYPE STRING.
  LV_TASK_ID = IV_TASK_ID.
  "WAIT UP TO 2 SECONDS.			"模拟运行时间2s
  CONCATENATE 'TASK ' `   ` LV_TASK_ID `   `  'HAS RUN!' INTO EV_TASK_NAME.

ENDFUNCTION.

非并发执行结果:

ABAP并发执行函数 异步RFC_第5张图片

并发执行结果:

ABAP并发执行函数 异步RFC_第6张图片

可以看到,此时使用并发执行的方式运行时间反而更慢了,如果把模拟次数增加,运行时间将会差的更多。

参考文章:

  1. 对ABAP程序调优的学习(三)并行并发读取
  2. 并发执行解决ABAP程序效能问题
  3. [ ABAP ] - 使用异步RFC实现并行处理

你可能感兴趣的:(SAP,ABAP,java,服务器,linux)