SAP小技巧 关于qRFC调用

2021-10-30 18:46发布


          点击此处--->   EasySAP.com 群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)

点击蓝字 关注我们

前言

关于RFC函数的调用方式介绍,大家可以自行百度找找. 也可以点击下面的连接(很详细的介绍了各种RFC调用方式)

https://www.cnblogs.com/hhelibeb/p/8066753.html

本文介绍一下qRFC的调用方式及注意事项.

(最近又在看三体,没有看过的朋友,强烈推荐你看一下,了解一下三体文明怎么通过远程调用打击地球文明的.)


二.什么是RFC

RFC remote function call远程功能调用.意味着调用远程系统的函数. 但是实际应用中. 这个远程系统也可以是自身. 只需要指定目标NONE . 就会指向当前服务器.


三.怎么维护远程系统?

事物代码SM59 ,如果是A调用A系统, 则无需维护RFC目标(当然也可以维护一个调用自身的RFC目标)


四.为什么要使用qRFC

原因一:实现异步调用. 调用方无需等待被调用方的反馈. 调用信息写入队列处理

原因二: 通过调用队列,解决被调用系统的进程占用问题.(一个极端的例子, 如果RFC函数性能极差,大量外围系统同步调用, 每个调用都会占用一个dialog进程,外围系统的RFC同步调用会占满所有的进程, 导入系统无法响应正常用户的处理要求)


五.入站队列与出站队列的区别?

假定A系统调用B系统,

出站队列表示数据停留在A系统的队列中,由A系统调度,

入站队列表示数据会停留在B系统的队列中. 由B系统调度.

如果A系统调用A系统, 则出站/入站没有本质的区别,只是可控制的参数不太一样,这种情况建议使用入站队列


六.队列需要注册么?

一般情况下调度队列无需注册.如果想对队列设置一些特定的参数, 可以注册一下队列. 这样可以给队列定义一些属性

出站队列似乎无需注册,可以直接执行 队列注册事物代码 SMQS(如图)

入站队列似乎需要注册,才能执行,否则队列一致处于ready状态 队列注册事物代码 SMQR(如图)

出站队列注册

入站队列注册


七.怎么实现qRFC的调用?

  1. RFC函数 示例函数中只有一个等待语句, 便于显示队列的执行情况(注意该函数的属性中一定要选中RFC调用,该函数最好没有返回参数)

  2. 调用qRFC示例程序.示例代码中没有捕获RFC函数调用的例外情况, 实际应用中,最好捕获一下. 

    ZTS_QRFC_CALL,源代码见文末


八.怎么监控队列?

出站队列 事物代码:SMQ1. 

入站队列 事物代码:SMQ2. 

队列监控可以执行队列内容查看,删除,错误监控,重处理等操作



执行示例程序,产生出站队列

进入SMQ1



执行示例程序,产生入站队列

进入 SMQ2


九.怎么改造原有外围系统接口调用qRFC?

一个最简单的方案是外围系统调用同步RFC函数. 在同步RFC函数中调用目标函数产生队列. 这样每个同步调用都能很快的处理完成,可以避免系统资源的大量占用



总结

qRFC大部分是在异步接口场景中使用. 通过队列的调度,可以简单实现异步调用的一些常用的监控,出错重处理功能.


源代码部分

*&---------------------------------------------------------------------**& Report ZTS_QRFC_CALL*&---------------------------------------------------------------------**&*&---------------------------------------------------------------------*REPORT zts_qrfc_call.PARAMETERS: p_sec   TYPE i DEFAULT 10,            rfcdest LIKE rfcdes-rfcdest DEFAULT 'NONE',            P_QNAME LIKE TRFCQIN-QNAME DEFAULT 'MY_QUEUE'.PARAMETERS: p_out RADIOBUTTON GROUP ra1,            p_in  RADIOBUTTON GROUP ra1.
INITIALIZATION. %_p_sec_%_app_%-text = '等待时间(秒)'. %_rfcdest_%_app_%-text = '远程调用目标'. %_p_out_%_app_%-text = '出站队列'. %_p_in_%_app_%-text = '入站队列'. %_p_QNAME_%_app_%-text = '队列名称'.

START-OF-SELECTION. CASE 'X'. WHEN p_in. PERFORM frm_qrfc_inbound. WHEN p_out. PERFORM frm_qrfc_outbound. ENDCASE.*&---------------------------------------------------------------------**& Form FRM_QRFC_INBOUND*&---------------------------------------------------------------------**& text*&---------------------------------------------------------------------**& --> p1 text*& <-- p2 text*&---------------------------------------------------------------------*FORM frm_qrfc_inbound . CALL FUNCTION 'TRFC_SET_QIN_PROPERTIES' EXPORTING* QOUT_NAME = ' ' qin_name = P_QNAME* QIN_COUNT =* CALL_EVENT = ' '* NO_EXECUTE = ' ' EXCEPTIONS invalid_queue_name = 1 OTHERS = 2.
CALL FUNCTION 'Z_BC_TEST_QRFC' IN BACKGROUND TASK AS SEPARATE UNIT DESTINATION rfcdest EXPORTING iv_wait = p_sec EXCEPTIONS communication_failure = 1 system_failure = 2 resource_failure = 3 OTHERS = 4.
COMMIT WORK. "提交才会写入队列
ENDFORM.*&---------------------------------------------------------------------**& Form FRM_QRFC_OUTBOUND*&---------------------------------------------------------------------**& text*&---------------------------------------------------------------------**& --> p1 text*& <-- p2 text*&---------------------------------------------------------------------*FORM frm_qrfc_outbound .*队列可以先注册, 也可以不注册 CALL FUNCTION 'TRFC_SET_QUEUE_NAME' EXPORTING qname = P_QNAME* NOSEND = ' '* TRFC_IF_SYSFAIL = ' '* CALL_EVENT = ' ' EXCEPTIONS invalid_queue_name = 1 OTHERS = 2.
CALL FUNCTION 'Z_BC_TEST_QRFC' IN BACKGROUND TASK AS SEPARATE UNIT DESTINATION rfcdest EXPORTING iv_wait = p_sec EXCEPTIONS communication_failure = 1 system_failure = 2 resource_failure = 3 OTHERS = 4.
COMMIT WORK. "提交才会写入队列
ENDFORM.


THE

END

约定

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

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



公众号 : syjf1976_abap

          ABAP开发技巧

微信号 : 392077


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



赞赏支持