二维码

[函数] 远程函数RFC调用的原理及特点

Twilight发表于 2015-04-15 20:20Twilight 最后回复于 2015-04-15 20:20 [复制链接] 4019 0

一、RFC介绍
  • RFC  Remote function Call 远程功能调用, 是SAP系统之间以及SAP与非SAP系统之间程序通信的基本接口技术
  • RFC通信模式分为同步模式和异步模式
  • SE37创建RFC Function时,仅允许通过值传递参数,不允许进行引用传递
  • 在不指定destination的场合下,RFC function可以作为普通函数使用
  • LUW(Logical Unit of Work),SAP系统中两个数据一致中的时间间隔叫LUW

RFC 1.jpg
RFC 2.jpg
SM59定义远程rfc连接
RFC 3.jpg
目的地SPACE、NONE 和BACK下列预定义的标准目的地具有不同的意义:
  • SPACE:对于函数模块的本地调用,相当于不指定CALL FUNCTION 的DESTINATION 关键字。
  • NONE:也是一种本地调用,但调用请求被发送给当前应用服务器的默认网关,并且在那里象一个外部调用请求一样被 处理。这个目的地适用于只有一个系统时的RFC 调用测试。
  • BACK:从应用服务器A 调用了应用服务器B 的函数模块, 在这个函数模块中要再调用应用服务器A 中的另一个函数模块,就使用这种目的地(它只有同步RFC 模式)。

不能从R/2 系统中使用这些标准目的地。目的地BACK 不能用于R/3 到R/2 的连接。

1、同步RFC(Synchronous RFC)
RFC 4.jpg
要求连接的双方是同步的工作方式,即都是在可用状态才能够实现成功调用。能实时返回结果值。
RFC 5.jpg
可以使用命令CALL FUNCTION ... DESTINATION. 调用远程的ABAP 函数模块或者甚至是外部服务器程序的C 子程序。
当以这种方式调用一个函数时,总是应该包括对标准异常COMMUNICATION_FAILURE 和SYSTEM_FAILURE 的处理。
异常COMMUNICATION_FAILURE 被触发的情况包括:没有在调用端的信息表RFCDES 中维护指定的目的地,或者无法建立对远程系统的连接。
异常SYSTEM_FAILURE 在想要在远程系统上开始的函数模块或者C 子程序不存在时被触发
RFC 6.jpg
在调用程序的上下文保持活动时,对远程目的地的连接也会保持完整。调用程序本身保持活动时,在远程 目的地中调用的函数组也保持活动(这跟本地调用是 一样的)。这意味着,如果先后调用了来自同一个函 数组的两个函数模块,它们可以访问这个函数组相同 的全局数据。
– 使用同步RFC 形式调用的每个函数模块都具有 自己的工作逻辑 单元(LUW)

2、异步RFC(Asynchronous RFC)
不是一种固定写法,它包含多种实现方式:
  • STARTING NEW TASK
  • IN UPDATE TASK
  • IN BACKGROUND TASK

其中Trfc、Qrfc等是IN BACKGROUND TASK异步方式的扩展
Prfc是STARTING NEW TASK异步方式的扩展
RFC 7.jpg
aRFC可以实现异步的RFC调用方式,它可以进行多个并发调用,相对同步sRFC,它的效率更高。
RFC 8.jpg
使用STARTING NEW TASK <task name> 附加关键字,可以异步的调用一个远程函数模块。任务名称可以任意选择。
– 被调用的函数模块在它自己的工作进程中执行。
– 还可以在后台进程中使用aRFC,然而需要注意, 在这种情况下RFC 调用也在各自的工作进程中执行。
– 在信息表RFCDES 端,可以用aRFC 选项来为每个目的地设置aRFC 调用的数量。在这些aRFC 调用之后,目标服务器会执行自动的负载检查。如果检测到 资源瓶颈,系统会等待一会儿,让相同的远程服务器 平衡下一个aRFC 调用,然后客户端程序才移出它的工作进程。客户端程序可以从以前的aRFC 调用接收到结果。

2.1、带确认的aRFC
RFC 9.jpg
这个子程序不能包含任何可能中断当前程序执行的语句(例如:CALL SCREEN、SUBMIT、COMMIT WORK、WAIT、RFC、W 或I 类型的消息)。这个子程序为aRFC 特别定义的WRITE 语句则没有影响。
– 只有在调用程序处于移出状态时——即使用了WAIT UNTIL 语句——子程序才能被自动执行。
– RECEIVE 语句的KEEPING TASK 附加关键字造成被远程加载的函数组上下文等待,直到调用程序结束。 这让你以后可以在相同的任务名称下的后续aRFC 中使用旧的远程上下文。

2.2、并行RFC( Parallel RFC )
RFC 10.jpg
它是aRFC的一种扩展类型。在执行大量的aRFC时,它改善了系统的性能,但是它只能执行在同一个系统和同一个client里。
当把一个应用服务器指定到某个RFC 组中,可以指定在什么样的条件下,这个应用服务器可以被认为是“在R/3 系统中对aRFC 可用”。如果对于这个aRFC 无法获取属于指定RFC 组的应用服务器,系统就会触发异常RESOURCE_FAILURE。
注意DESTINATION IN GROUP 附加关键字它与DESTINATION 附加关键字很不一样。
必须在STARTING NEW TASK 之后指定。
只能在同一个R/3 系统中使用,不能与DESTINATION 一起使用。

RZ12查看RFC group

2.3、事务RFC(Transactional RFC)
是对aRFC进行相关技术改进后的一个RFC版本,其于aRFC相同点是
实现异步调用,其优点是可以将多个调用进行LUW分组处理, 并只
执行一次运行。现在aRFC基本上已经停用。

ABAP语法关键字:IN BACKGROUND TASK
  • 需要显示DB commit
  • 用SM58查看正在运行的tRFC
  • 不能接收tRFC的返回参数
  • 在commit work之前调用START_OF_BACKGROUNDTASK可以延时启动tRFC

用IN BACKGROUND TASK 附加关键字来使用tRFC,必须放在DESTINATION 条目之前。如果指定了COMMIT WORK 语句,就可以把所有以前传输的tRFC 捆绑到一个LUW 中。
tRFC 也是异步调用的,跟aRFC 不同,来自被调用函数模块的输出无法被接收当调用时没有IMPORTING .../ PERFORMING ... ON END OF TASK。
没有RECEIVE RESULTS FROM FUNCTION ..
在源系统,可以使用管理事务码SM58 来显示和修改tRFC 工作逻辑单元。
RFC 11.jpg
IN background task  START_OF_BACKGROUNDTASK
如果程序在目的地系统的tRFC LUW 成功执行后,被A 或X 类型的消息中止,或者触发了异常,就会发生下列情况:所有在远程系统的当前LUW 中被执行的修改都被回滚。
这些修改记录在源系统的tRFC 状态表ARFCSSTATE 中(可以用SM58 查看)。

2.4、队列RFC(queued RFC)
  • 是tRFC的一个增强版本,它保证了所传输数据的处理次序,先进先出
  • 调用TRFC_SET_QUEUE_NAME确定tRFC的先进先出(FIFO)队列
  • 队列名最长24位,不能%开头,不能包含*
  • SMQ1监视qRFC
  • 如果在远程系统的一个LUW 发生错误,整个队列都会回滚。相关的 LUW 和所有队列中的其他LUW 保留在队列和tRFC 表中。在纠正错误 后,可以使用事务码SMQ1 重新传输队列。

RFC 12.jpg
RFC 13.jpg
SMQ1 可以有下列功能:
  • 列出队列
  • 显示队列中相关LUW 的列表和包含输入数据的函数模块
  • 开始或停止队列的传输
  • 删除队列


二、特点比较
RFC种类 执行时间 处理模式 返回参数 状态查询
同步sRFC 立即执行 同步 支持 不提供
异步aRFC 立即执行 异步 支持 不提供
事务tRFC Commit work 异步,一次执行 不支持 SM58
并行pRFC 立即执行 异步 不支持不提供
队列qRFC Commit work 异步,一次顺序执行 不建议使用SMQ1

回复

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表