Reference => 官方文档 SAP Help Portal-RFC
1.同步RFC
-
同步RFC(sRFC,synchronous RFC)是RFC最原始版本,其执行基于同步通信模式,远程调用时,通信双方系统必须处于可用状态,调用程序等待远程功能处理结束并返回结果
-
语法形式:
CALL FUNCTION 'rfm_name' DESTINATION dest EXPORTING ... IMPORTING ... CHANGING ... TABLES ... EXCEPTIONS ...
2.异步RFC
-
异步RFC(aRFC,asynchronous RFC)执行并不依赖RFC服务器系统的可用性,被调用的远程功能启动之后,调用程序继续运行,远程功能和调用程序处理互不影响,独立运行。远程功能调用结构可以稍后接收(在做并行aRFC时一定要考虑负载性能)
-
PERFORMING frm_return_proc ON END OF TASK 可用于接收远程模块返回结果或异常,并通过指定的FORM处理
-
WAIT UNTIL log_exp [UP TO sec SECONDS] 用于异步RFC调用中等待结果的返回,并必须搭配 PERFORMING语句
-
KEEPING TASK 用于相同任务名称的异步RFC启用时保持远程上下文,即使用相同的TASK
-
语法形式:
CALL FUNCTION 'rfm_name' DESTINATION dest STARTING NEW TASK taskname PERFORMING frm_return_proc ON END OF TASK "接收远程模块返回结果或异常 EXPORTING ... CHANGING ... TABLES ... EXCEPTIONS ... ... WAIT UNTIL log_exp [up to sec seconds]. "挂起进程等待 ... FORM frm_return_proc USING taskname. "处理函数 ... RECEIVE RESULTS FROM FUNCTION 'rfm_name' "获取返回参数 KEEPING TASK "保持远程上下文 IMPORTING ... TABLES ... EXCEPTIONS ... ... ENDFORM.
3.并行RFC
-
并行RFC(pRFC,parallel RFC)本质上也属于异步RFC,功能上可实现多个SAP系统或者单个SAP系统内部不同应用服务器间或者应用服务器内部各应用进程间的并行处理
-
通过SM59->RFC组对现有应用服务器分组
-
RFC调用时则可指定执行的RFC应用服务器组,还可以使用 DEFAULT 关键字,系统将从全部可能的应用服务器中选择一个来执行RFC调用
-
为了并行处理,SAP服务器至少有3个空闲的Dialog工作过程;同时需要满足调度器队列(dispatcer queue)必须低于10%负载,否则将触发RESOUCE_FAILURE异常
-
并行RFC同样适用 PERFORMING WAIT UNTIL KEEPING TASK 等异步RFC语法
-
语法形式:
CALL FUNCTION 'rfm_name' DESTINATION IN GROUP 'group_name' "group_name OR default STARTING NEW TASK taskname EXPORTING ... TABLES ... EXCEPTIONS RESOURCE_FAILURE = 3 ...
4. bgRFC
-
后台RFC(bgRFC,Background RFC) 允许应用程序记录稍后由被调用应用程序接收的数据。接收到数据后,您必须确保数据仅以任意顺序( 事务性)传输一次或仅以创建顺序( 排队)传输一次。
-
ABAP 710开始,bgRFC 是对原来 tRFC 和 qRFC的重新设计,理论上性能更优;NW RFC SDK 也支持 bgRFC(NW RFC SDK 本身将 bgRFC 调用视为 tRFC 调用,实际处理并任何差异)
-
Reference:bgRFC Programming
-
bgRFC之tRFC(tRFC,Transaction RFC)
- 事务性RFC(tRFC,transactional RFC)广义上也属于异步RFC,调用程序不接受调用结果而继续执行,但不立即启动远程调用功能;关联的RFC被捆绑为一个事务,然后通过事务性处理;被捆绑的Task整体提交处理,其中一个失败,则全部取消;全部成功则提交处理;保证了数据一致性
- ABAP 7.0 以后可用面向对象的调用方式 ref_obj参照接口 IF_BGRFC_UNIT实现类的对象
- 多LUW处理
- 每个tRFC调用都有一个独特的事务ID(Transactional ID,TID)存储于本地数据表ARFCSSTATE ARFCSDATA
- SM58->tRFC 状态(ARFCSSTATE) LUW执行状态查看
- 语法形式:
CALL FUNCTION 'rfm_name' IN BACKGROUND TASK [DESTINATION dest] EXPORTING ... TABLES ... [AS SEPARATE UNIT] 或者: CALL FUNCTION 'rfm_name' IN BACKGROUND UNIT ref_obj EXPORTING ... TABLES ...
-
bgRFC之qRFC(qRFC,queued RFC)
- 队列RFC(qRFC,queued RFC)是事务性RFC功能上的进一步扩展。事务性RFC中,存在多个LUW时,LUW执行次序无法确定。如果需要LUW按照指定顺序执行,可通过队列RFC对事务性RFC进行序列化
- Reference:qRFC Programming
- 语法形式:
CALL FUNCTION 'TRFC_SET_QUEUE_NAME' EXPORTING qname = 'ZRFC_QUEUE01' EXCEPTIONS invalid_queue_name = 1 OTHERS = 2. CALL FUNCTION 'rfc_name1' IN BACKGROUND TASK DESTINATION dest EXPORTING ... TABLES ... CHANGING ... EXCEPTIONS ... CALL FUNCTION 'TRFC_SET_QUEUE_NAME' EXPORTING qname = 'ZRFC_QUEUE02' EXCEPTIONS invalid_queue_name = 1 OTHERS = 2. CALL FUNCTION 'rfc_name2' IN BACKGROUND TASK DESTINATION dest EXPORTING ... TABLES ... CHANGING ... EXCEPTIONS ... ... COMMIT WORK. ...
5. 本地调用的远程功能
-
使用 DESTINATION ‘NONE’ 关键字,调用将会以远程的方式调用,但是调用的功能位于当前应用系统中
-
当使用 DESTINATION SPACE 关键字,此关键字被忽略,即使用常规本地调用
-
语法形式:
CALL FUNCTION 'rfc_name' IN BACKGROUND TASK DESTINATION 'NONE' EXPORTING ... TABLES ... CHANGING ... EXCEPTIONS ...
6. 远程回调功能
-
使用 DESTINATION ‘BACK’ 关键字,将开启远程回调功能;即被调用方可通过已建立的Session调用调用方系统内部的Function
-
- 当使用 DESTINATION SPACE 关键字,此关键字被忽略,即使用常规本地调用
-
语法形式:
CALL FUNCTION 'rfc_name' IN BACKGROUND TASK DESTINATION 'BACK' EXPORTING ... TABLES ... CHANGING ... EXCEPTIONS ...