ABAP并发执行函数 异步RFC

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

实现效果:
image-20230704135322302

首先定义一个RFC函数:

image-20230704135702597

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     "可以理解为线程名为<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 ).

image-20230704135518439

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

image-20230704135535170

这里可以明显感觉到并发的执行效率远远优于非并发执行,这里的性能比超过了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.

非并发执行结果:

image-20230704142137636

并发执行结果:

image-20230704142226884

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

参考文章:

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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ABAP中,可以通过执行RFC(远程函数调用)与远程系统进行通信。ABAP可以充当RFC客户端或者RFC服务器。 当ABAP作为RFC客户端时,它可以通过RFC函数模块调用远程系统中的函数,并传递相应的参数。ABAP程序可以使用RFC函数模块通过网络与远程系统通信,以获取或更新远程系统中的数据。在RFC调用期间,ABAP程序会将请求发送到远程系统并等待响应,然后继续执行后续的程序逻辑。 ABAP也可以作为RFC服务器,即提供RFC函数模块供其他系统调用。在这种情况下,ABAP程序充当服务器角色,接收来自其他系统的RFC请求,并执行相应的功能。ABAP程序可以处理来自远程系统的请求,获取所需的数据,并将结果返回给调用方。 ABAP执行RFC的过程中需要注意以下几点: 1. 首先,需要在ABAP程序中调用RFC函数模块,并传递所需的参数。参数应与RFC函数模块的定义一致,以确保正确的数据传递和处理。 2. 在RFC调用期间,需要确保网络连接的可靠性和稳定性。如果网络连接中断或发生错误,可能会导致RFC调用失败或超时。 3. 在处理RFC请求时,需要检查并处理可能的错误和异常情况。合理使用错误处理机制,以确保调用方能够正确处理和处理返回的错误信息。 4. ABAP程序必须具有足够的权限和授权,以执行RFC调用所需的操作。权限问题可能会导致RFC调用失败或访问被拒绝。 总结而言,ABAP可以通过执行RFC与远程系统进行通信,从而实现数据的交互和功能调用。通过合理处理RFC调用过程中的参数传递、网络连接、错误处理和权限控制等问题,可以确保RFC调用的成功执行

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值