IT干货网

ABAP-QRFC-解决锁冲突问题

flyfish 2022年03月09日 SAP 151 0

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查看入站队列记录,执行完成后队列显示为空。


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

ABAP-CODEPAGE