QRFC-队列RFC
1.并发场景问题
在并发处理或是后台JOB运行过程中经常出现‘物料被锁定’等相关的报错,为防止多进程之间锁机制的冲突,可使用QRFC方式进行处理。
QRFC在相同的队列名称下,将并发执行转换为串行执行的过程。QRFC分为出站与入站,本文只介绍入站处理过程。
QRFC:
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查看入站队列记录,执行完成后队列显示为空。