SAP小技巧 关于qRFC调用
点击蓝字 关注我们
一
前言
关于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的调用?
RFC函数 示例函数中只有一个等待语句, 便于显示队列的执行情况(注意该函数的属性中一定要选中RFC调用,该函数最好没有返回参数)
调用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
公众号主群加入受限, 请扫码加入副群后,向管理员申请加入主群
文章来自于网络,如果侵犯了您的权益,请联系站长删除!