zoukankan      html  css  js  c++  java
  • ABAP-QRFC-解决锁冲突问题

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

  • 相关阅读:
    网络协议 19
    网络协议 18
    网络协议 17
    网络协议 16
    网络协议 15
    .NET基础知识(01)-值类型与引用类型
    .NET基础知识(02)-拆箱与装箱
    网络协议 14
    网络协议 13
    网络协议 12
  • 原文地址:https://www.cnblogs.com/ricoo/p/14978191.html
Copyright © 2011-2022 走看看