QRFC-队列RFC

1.并发场景问题

在并发处理或是后台JOB运行过程中经常出现‘物料被锁定’等相关的报错,为防止多进程之间锁机制的冲突,可使用QRFC方式进行处理。

QRFC在相同的队列名称下,将并发执行转换为串行执行的过程。QRFC分为出站与入站,本文只介绍入站处理过程。

QRFC:

●      qRFC with Outbound Queue

●      qRFC with Inbound Queue

2.创建RFC

2.1RFC参数

 IV_UUID业务数据唯一标识GUID,根据标识获取业务数据并调用程序执行。

 IV_QRFC本次RFC执行是否启用队列标识,外部调用若设置IV_QRFC=‘X',则会调用RFC两次。

2.2RFC执行过程

 外部传参IV_QRFC = 'X',则:

 第一次调用先创建队列名称,队列名设置为常量,将多个任务发布在此队列下。

 第二次调用是由自身RFC触发,当前传入参数IV_QRFC = SPACE,则直接调用功能程序执行<SUBMIT>。

function zgl_mm_g003_material_qrfc.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(IV_UUID) TYPE  UUID OPTIONAL
*"     VALUE(IV_QRFC) TYPE  CHAR1 OPTIONAL
*"----------------------------------------------------------------------

  data: lr_zguid type range of zlc_mm_t20-zguid,
        lr_upflg type range of zlc_mm_t20-upflg.

  check iv_uuid is not initial.

  if iv_qrfc is initial.
    "&--第二次调用RFC-- IV_QRFC = SPACE
    append initial line to lr_zguid assigning field-symbol(<fs_zguid>).
    <fs_zguid>-sign   = 'I'.
    <fs_zguid>-option = 'EQ'.
    <fs_zguid>-low    = iv_uuid.
    unassign <fs_zguid>.

    append initial line to lr_upflg assigning field-symbol(<fs_upflg>).
    <fs_upflg>-sign   = 'I'.
    <fs_upflg>-option = 'EQ'.
    <fs_upflg>-low    = space.
    unassign <fs_upflg>.
    
    "&--调用功能执行程序
    submit zlc_mm_f100
      with s_zguid in lr_zguid
      with s_upflg in lr_upflg
      with p_bkjob eq abap_true
      and return.
  else.

    "&--第一次调用RFC-外部传参IV_QRFC = 'X'
    data: lv_qin_name type trfcqin-qname.
    "&--设置队列名称-常量(将多个执行任务放在相同队列下)
    lv_qin_name = 'GEMS-MM-CRT'.

    call function 'TRFC_SET_QIN_PROPERTIES'
      exporting
        qin_name                 = lv_qin_name
      exceptions
        invalid_queue_name       = 1
        others                   = 2
              .
    if sy-subrc <> 0.
    endif.
    
    "&--调用自身RFC -- IV_QRFC = SPACE
    call function 'ZGL_MM_G003_MATERIAL_QRFC'
      in background task
      as separate unit
      exporting
        iv_uuid             = iv_uuid
      exceptions
        failed              = 1
        others              = 2.
    if sy-subrc <> 0.
    endif.

    commit work.
  endif.
endfunction.

3.注册队列

TCODE:SMQR  点击Registration进行注册,队列名则为上一步设置的队列名称。

4.测试

"Execution
call function 'ZGL_MM_G003_MATERIAL_QRFC'
  exporting
    iv_uuid       = lv_uuid
    iv_qrfc       = abap_true.

4.1调用RFC,设置参数IV_QRFC = ABAP_TRUE.

4.2TCODE:SMQ2查看入站队列记录,执行完成后队列显示为空。

 

posted on 2021-07-06 18:04  ricoo  阅读(808)  评论(0编辑  收藏  举报