SAP小技巧 使用bgRFC优化TRFC,QRFC

点击蓝字 关注我们

前言

bgRFC是设计整合TRFC与QRFC调用的一种后台调用RFC的方式. 与单纯的TRFC/QRFC比较, bgRFC增加了入站目标管理,并且把入站目标与系统进程资源管理整合在一起, 可以更好的调度RFC的执行过程.

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

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

bgRFC调用实现过程

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

  • 配置部分

  • 代码实现部分

bgRFC的配置

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

01

创建一个调用目标

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

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

02

定义入站目标

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

登陆组维护(RZ12)

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

03

入站目标的控制参数

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

代码实现部分

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

详见链接

qRFC调用

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

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

测试程序名 ZTS_BGRFC_CALL

01

执行程序

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

01

监控直接结果

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

事物代码: SBGRFCMON

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

03

变更RFC函数

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

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

bgRFC队列成功调用

04

监控功能

锁定目标

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

删除目标锁定,

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

单元的其它处理功能

QRFC调用

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


总结

官方文档中介绍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
      startdate = sy-datum
      starttime = sy-uzeit
    EXCEPTIONS
      OTHERS    = 1.
  IF sy-subrc = 1.
    EXIT.
  ENDIF.
  COMMIT WORK.  "提交才会写入队列


ENDFORM.
FORM frm_bgrfc_qout .
  DATA lo_destination TYPE REF TO if_bgrfc_destination_outbound.
  DATA lo_qoutrfc_unit TYPE REF TO if_qrfc_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_qoutrfc_unit = lo_destination->create_qrfc_unit( ).
*  lo_trfc_unit->disable_commit_checks( ).


  CALL FUNCTION 'Z_BC_TEST_BGRFC' IN BACKGROUND UNIT lo_qoutrfc_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.

THE

END

约定

如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.       

    (如果你真的喜欢这篇文章,请记得回来打个赏,作为支持我继续下去的动力,这是一个正反馈过程. 越多的人打赏,作者越有动力分享,读者就能享受更多的福利.毕竟打赏的金额富不了我,穷不了你,却能支持这个公众号长久发文.)

公众号 : syjf1976_abap

          ABAP开发技巧

微信号 : 392077

公众号主群加入受限, 请扫码加入副群后,向管理员申请加入主群

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值