[ ABAP ] - 使用异步RFC实现并行处理


原文链接:https://blog.csdn.net/nkGavinGuo/article/details/80949381

1. 异步RFC的基本原理

在处理大数据量的工作时,ABAP提供了并行处理的机制。实现并行处理的常用方式有两种:background job的方式和asynchronous RFC (aRFC)的方式。

所谓并行处理,也即将要处理的目标数据,按一定的规则划分成多个独立的package,将每个package分发到不同的application server instance (AS instance)上处理。

其原理图如下:

AS instance示意图

 
使用aRFC做并行处理,其关键字为
1) STARTING NEW TASK task_name, 这句话会开启一个新的dialog process
2) DESTINATION IN GROUP group_name, 这句话指定dialog process运行在哪个server group上,若使用DEFAULT,则会随机分配一个空闲的AS instance上
3) PERFORMING call_back ON END OF TASK, 异步进程结束后的回调函数
4) RECEIVE RESULTS FROM FUNCTION function_name, 用于接收异步进程处理返回的结果

下面这个例子中,会循环10次,开启异步进程查看系统的自身信息。
 

*&---------------------------------------------------------------------*
*& Report  YCX_ARFC
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT ycx_arfc.

TYPES: BEGIN OF task_type,
         name TYPE string,
         dest TYPE string,
       END OF task_type.

DATA: snd_jobs  TYPE i,
      rcv_jobs  TYPE i,
      exc_flag  TYPE i,
      info      TYPE rfcsi,
      mess      TYPE c LENGTH 80,
      indx      TYPE c LENGTH 4,
      name      TYPE c LENGTH 8,
      task_list TYPE STANDARD TABLE OF task_type,
      task_wa   TYPE task_type.

DO 10 TIMES.
  indx = sy-index.
  CONCATENATE 'Task' indx INTO name.

  CALL FUNCTION 'RFC_SYSTEM_INFO'
    STARTING NEW TASK name
    DESTINATION IN GROUP DEFAULT  "' 390' "pRFC
    PERFORMING rfc_info ON END OF TASK
    EXCEPTIONS
      system_failure        = 1 MESSAGE mess
      communication_failure = 2 MESSAGE mess
      resource_failure      = 3.

  CASE sy-subrc.
    WHEN 0.
      snd_jobs = snd_jobs + 1.
    WHEN 1 OR 2.
      MESSAGE mess TYPE 'I'.
    WHEN 3.
      IF snd_jobs >= 1 AND
      exc_flag = 0.
        exc_flag = 1.
        WAIT UNTIL rcv_jobs >= snd_jobs
        UP TO 5 SECONDS.
      ENDIF.
      IF sy-subrc = 0.
        exc_flag = 0.
      ELSE.
        MESSAGE 'Resource failure' TYPE 'I'.
      ENDIF.
    WHEN OTHERS.
      MESSAGE 'Other error' TYPE 'I'.
  ENDCASE.
ENDDO.

WAIT UNTIL rcv_jobs >= snd_jobs.

LOOP AT task_list INTO task_wa.
  WRITE: / task_wa-name, ', Server:', task_wa-dest.
ENDLOOP.

*&---------------------------------------------------------------------*
*&      Form  rfc_info
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->NAME       text
*----------------------------------------------------------------------*
FORM rfc_info USING name.
  task_wa-name = name.
  rcv_jobs = rcv_jobs + 1.
  RECEIVE RESULTS FROM FUNCTION 'RFC_SYSTEM_INFO'
  IMPORTING
    rfcsi_export = info
  EXCEPTIONS
    system_failure        = 1 MESSAGE mess
    communication_failure = 2 MESSAGE mess.

  IF sy-subrc = 0.
    task_wa-dest = info-rfcdest.
  ELSE.
    task_wa-dest = mess.
  ENDIF.
  APPEND task_wa TO task_list.
ENDFORM.                    "rfc_info

运行结果:

 可以看出,异步RFC的调用顺序和执行顺序不一致,所以ARFC 不能保证调用的先后顺序,如果一个处理进程了启用了多次 ARFC 并且业务是有先后顺序的,可能会有问题。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值