SAP 小技巧使用 bg RFC 优化 TRFCQRFC

作者:ABAP技巧与实战 约 7 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:ABAP, Basis, Data Engineering, WM, 仓库管理, 开发, 数据工程, 系统管理

无峰 [ ABAP 技巧与实战 ](javascript:void\(0\);)

**点击蓝字** 关注我们

前言

bgRFC是设计整合TRFC与QRFC调用的一种后台调用RFC的方式. 与单纯的TRFC/QRFC比较,

bgRFC增加了入站目标管理,并且把入站目标与系统进程资源管理整合在一起, 可以更好的调度RFC的执行过程.

理论上bgRFC 支持TRFC 入站/出站和QRFC 入站/出站.

**本文主要讲解通过bgRFC实现TRFC入站和QRFC入站**

bgRFC调用实现过程

实现过程大概区分了两个部分

• 配置部分

• 代码实现部分

bgRFC的配置

事物代码: SBGRFCCONF 后台远程函数调用配置

SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图
SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图

_**01** _

**创建一个调用目标**

SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图
SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图

点击保存后, 管理程序目标会被新创建的替代

SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图
SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图

双击目标, 可以跳转到SM59.(是一种指向本地的特殊的RFC目标)

SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图
SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图

_**02** _

**定义入站目标**

其中的登录组可以通过事务代码 RZ12维护(通过登陆组可以控制对进程的占用)

SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图
SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图

登陆组维护(RZ12)

SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图
SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图
SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图
SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图

添加允许的队列前缀(QRFC队列的名称必须符合这里配置的前缀,否则会报错)

SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图
SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图

_**03** _

**入站目标的控制参数**

定义特定入站目标的一些控制参数

SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图
SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图

代码实现部分

尝试使用上文中的函数(函数中使用等待语句等待特定时间)

详见链接

> qRFC调用

>

> 无峰,公众号:ABAP 技巧与实战 [ SAP小技巧 关于qRFC调用

> ](http://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247485540&idx=1&sn=9b798de86d1966fe142c69467865ecce&chksm=cf5dd552f82a5c44e558b8d96e9408fa6f29fd934c6e8268b7a5a219196575614a4c16ae66bb#rd)

源代码实现部分(源代码详见文末, 目前只实现了 入站部分的调用)

测试程序名 ZTS_BGRFC_CALL

_**01** _

**执行程序**

执行 TRFC入站. **目标名称使用配置阶段配置的ZTS_BGRFC_IN**

SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图
SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图

_**01** _

**监控直接结果**

测试结果可以在监控器中查看

事物代码: SBGRFCMON

SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图
SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图
SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图
SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图

双击可以看到详细错误: 原测试函数中的wait up to 语句在bgRFC中不被允许使用. 看来bgRFC有一些语法限制.

SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图
SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图

_**03** _

**变更RFC函数**

修改函数中的代码,改成写入自定义表.

SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图
SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图
SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图
SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图

执行程序后. 目标表中成功写入记录.

bgRFC队列成功调用

_**04** _

**监控功能**

锁定目标

SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图
SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图
SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图
SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图

此时新执行的内容会写入到单元中. 但是不执行

SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图
SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图

**删除目标锁定,**

**单元中的正常状态的条目会执行成功.**

单元的其它处理功能

SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图
SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图

QRFC调用

SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图
SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图

调用后,会看到队列的信息

SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图
SAP 小技巧使用 bg RFC 优化 TRFCQRFC - 封面图

总结

官方文档中介绍bgRFC用于改进QRFC和TRFC. 实际应用中,确实发现在进程调度方面有了一些的改进.

建议后续的此类开发都尽量使用bgRFC.

目前只验证了TRFC/QRFC 入站的调度方式. 理论上应该也有TRFC出站/QRFC出站的调度, 但是在配置界面没有看到出站目标的定义,

可能是我的服务器版本较低的原因吧.

测试程序源代码

测试程序中只有入站部分测试通过, 出站部分会报错,因为配置界面没有出站目标的配置.

*&---------------------------------------------------------------------**& Report ZTS_QRFC_CALL*&---------------------------------------------------------------------**&SBGRFCCONF bgRFC 配置*SBGRFCMON bgRFC 监控器*&---------------------------------------------------------------------*REPORT zts_bgrfc_call.PARAMETERS: p_sec TYPE i DEFAULT 10, rfcdest LIKE rfcdes-rfcdest DEFAULT 'NONE', p_uname TYPE bgrfc_dest_name_inbound DEFAULT 'ZTS_BGRFC_IN', "执行前,必须要先注册 p_qname TYPE qrfc_queue_name DEFAULT 'MY_QUEUE'.PARAMETERS: p_tin RADIOBUTTON GROUP ra1, p_tout RADIOBUTTON GROUP ra1, p_qin RADIOBUTTON GROUP ra1, p_qout RADIOBUTTON GROUP ra1.

INITIALIZATION. %_p_sec_%_app_%-text = '等待时间(秒)'. %_rfcdest_%_app_%-text = '远程调用目标'. %_p_uname_%_app_%-text = '目标名称'. %_p_qname_%_app_%-text = '队列名称'. %_p_tin_%_app_%-text = 'TRFC入站'. %_p_tout_%_app_%-text = 'TRFC出站'. %_p_qin_%_app_%-text = 'QRFC入站'. %_p_qout_%_app_%-text = 'QRFC出站'.

START-OF-SELECTION. CASE 'X'. WHEN p_tin."通过trfc inbound方式调用bgRFC PERFORM frm_bgrfc_tin. WHEN p_tout."通过trfc outbound方式调用bgRFC PERFORM frm_bgrfc_tout. WHEN p_qin. "通过qRFC inbound 方式调用bgRFC PERFORM frm_bgrfc_qin. WHEN p_qout. "通过qRFC outbound 方式调用bgRFC PERFORM frm_bgrfc_qout. " ENDCASE.*&---------------------------------------------------------------------*

FORM frm_bgrfc_tin . DATA lo_destination TYPE REF TO if_bgrfc_destination_inbound. DATA lo_trfc_unit TYPE REF TO if_trfc_unit_inbound. DATA lc_bgrfc_dest_name TYPE bgrfc_dest_name_inbound . lc_bgrfc_dest_name = p_uname. DATA myref TYPE REF TO cx_bgrfc_invalid_destination . DATA err_text TYPE string. DATA result TYPE i. TRY. lo_destination = cl_bgrfc_destination_inbound=>create( lc_bgrfc_dest_name ). CATCH cx_bgrfc_invalid_destination INTO myref. err_text = myref->get_text( ). MESSAGE s001(00) WITH err_text. EXIT. ENDTRY. lo_trfc_unit = lo_destination->create_trfc_unit( ).* lo_trfc_unit->disable_commit_checks( ). CALL FUNCTION 'Z_BC_TEST_BGRFC' IN BACKGROUND UNIT lo_trfc_unit EXPORTING iv_wait = p_sec. CALL FUNCTION 'START_OF_BACKGROUNDTASK' EXPORTING startdate = sy-datum starttime = sy-uzeit EXCEPTIONS OTHERS = 1. IF sy-subrc = 1. EXIT. ENDIF. COMMIT WORK. "提交才会写入队列 ENDFORM.FORM frm_bgrfc_tout . DATA lo_destination TYPE REF TO if_bgrfc_destination_outbound. DATA lo_trfc_unit TYPE REF TO if_trfc_unit_outbound. DATA lc_bgrfc_dest_name TYPE bgrfc_dest_name_outbound . lc_bgrfc_dest_name = p_uname. lo_destination = cl_bgrfc_destination_outbound=>create( lc_bgrfc_dest_name ). lo_trfc_unit = lo_destination->create_trfc_unit( ).* lo_trfc_unit->disable_commit_checks( ). CALL FUNCTION 'Z_BC_TEST_BGRFC' IN BACKGROUND UNIT lo_trfc_unit EXPORTING iv_wait = p_sec. CALL FUNCTION 'START_OF_BACKGROUNDTASK' EXPORTING startdate = sy-datum starttime = sy-uzeit EXCEPTIONS OTHERS = 1. IF sy-subrc = 1. EXIT. ENDIF. COMMIT WORK. "提交才会写入队列 ENDFORM.FORM frm_bgrfc_qin . DATA lo_destination TYPE REF TO if_bgrfc_destination_inbound. DATA lo_qinrfc_unit TYPE REF TO if_qrfc_unit_inbound. DATA lc_bgrfc_dest_name TYPE bgrfc_dest_name_inbound . lc_bgrfc_dest_name = p_uname. lo_destination = cl_bgrfc_destination_inbound=>create( lc_bgrfc_dest_name ). lo_qinrfc_unit = lo_destination->create_qrfc_unit( ).*TRY. CALL METHOD lo_qinrfc_unit->add_queue_name_inbound EXPORTING queue_name = p_qname* ignore_duplicates = ABAP_FALSE .* CATCH cx_bgrfc_invalid_unit .* CATCH cx_qrfc_duplicate_queue_name .* CATCH cx_qrfc_invalid_queue_name .*ENDTRY. * lo_trfc_unit->disable_commit_checks( ). TRY. CALL METHOD lo_qinrfc_unit->add_queue_name_inbound EXPORTING queue_name = p_qname. CATCH cx_bgrfc_invalid_unit . CATCH cx_qrfc_duplicate_queue_name . CATCH cx_qrfc_invalid_queue_name . ENDTRY. CALL FUNCTION 'Z_BC_TEST_BGRFC' IN BACKGROUND UNIT lo_qinrfc_unit EXPORTING iv_wait = p_sec. CALL FUNCTION 'START_OF_BACKGROUNDTASK' EXPORTING star

...

ABAP技巧与实战

关于作者:ABAP技巧与实战

企业信息化与 SAP 技术顾问,长期专注 SAP ABAP、FI/CO、MM、SD 等模块的技术分享与实战经验总结。查看更多介绍

来源说明:本文内容由「SAP小技巧使用bgRFC优化TRFCQRFC.md」整理生成,仅用于内部技术分享与学习交流。