事务性RFC方式的RFM调用
l 同步、异步RFC过程中,每一个RFC调用在远程系统中构成一个独立的LUW
l 事务性RFC调用,可以将多个逻辑上相关的远程调用绑定至同一个LUW上,在该LUW内,按顺序调用,要么执行所有数据库操作,要么完全回滚来取消全部数据库更新操作,保证RFC调用过程的完整性和数据一致性
l 事务性RFC调用处理保证在程序到达COMMIT WORK语句时执行所有计划的更新,并保证事务性RFC调用仅运行一次
l 该调用具有安全、可靠的特点
CALL FUNCTION rfm_name IN BACKGROUND TASK [DESTINATION dest] [EXPORTING p1 = a1 ... pn = an ... ] [TABLES t1 = itab1 ... tn = itabn ... ] [AS SEPARATE UNIT]. CALL FUNCTION rfm_name IN BACKGROUND UNIT oref [EXPORTING p1 = a1 ... pn = an ... ] [TABLES t1 = itab1 ... tn = itabn ... ].
其中oref必须引用一个接口IF_BGRFC_UNIT实现类的对象
l 在相邻两个COMMIT WORK之间出现的所有相同目标的异步调用都属于同一个LUW
l 事务性RFC不需要等待每个单独的更新过程完成,调用程序就可以立即继续进行,知道事务结束
l 若调用发送时,远程系统不可用,调用将设为后台作业运行,不能从调用模块接收返回结果,不允许调用者进行与远程系统的交互性对话及测试
调用参数
l 不能直接或通过RECEIVE RESULTS FROM FUNCTION语句接收RFM的返回结果,FM的接口不应指定任何EXPORT类型参数,在CALL FUNCTION语句中的IMPORTING参数将导致编译错误
l 事务性运行的功能模块中不适合进行回调(调用远程目标BACK)
l 事务性RFC调用示例
CALL FUNCTION 'TRAVEL_BOOK_REMOTE' IN BACKGROUND TASK DESTINATION 'GSE' EXPORTING FLIGHT = sflight CUSTOMERID = customer. … COMMIT WORK.
l 直到COMMIT WORK 语句才开始于远程系统进行联系
l TRAVEL_BOOK_REMOTE是一个适合进行事务性RFC调用的RFM,只进行远程系统中的数据库更新,不需要返回任何数据
事务ID
l 每一个事务性RFC调用均通过一个独特的事物ID(Transactional ID,TID)
l TID存在于数据库表ARFCSSTATE和ARFCSDATA,ARFCSSTATE记录LUW执行状态,ARFCSDATA包含事务性RFC调用的输入数据
l 作业执行过程中,从事务性RFC表中读取相关数据,与相应的事务性RFC进行通信,远程LUW成功执行,则相应的条目在表中删除,因此,若LUW运行成功,则无法重新执行因而保证了仅仅执行一次
l 若COMMIT WORK同时触发了本地更新操作,则事务性RFC调用在本地更新成功完成之后才开始运行
设定作业开始时间
l 如果希望在特定时间启动LUW,可以通过功能模块START_OF_BACKGROUPTASK设置作业开始的时间,必须在LUW内部调用该功能模块,必须在第一个CALL…IN BACKGROUNDTASK语句之后和COMMIT WORK语句之前调用该功能模块
l 对于某个调用需要创建独立的事务,不参与其他目标的事务性RFC调用作何至一个LUW,可以通过AS SEPARATE UNTIAL附加项实现
l 各个LUW处理都是独立进行的,执行次序无法被保证
出错处理机制
l 发生错误,事务性RFC调用将启动重试机制或者回滚
l 通过COMMIT WORK执行远程调用时,不能建立到目标系统的连接,将在ARFCSSTATE表中记录当前状态,系统通过报表RSARFCSE根据当前的TID重新计划后台作业,准备进行下一次调用。
l 默认时间间隔15分钟,尝试至30次为止
l Tools-Administraion-Administraion-Network-RFCdestinations-Destination-TRFC options进行尝试次数、时间间隔设定
l 若经过最大尝试次数,系统仍然无法连接,系统将停止调用报表RSARFCSE,将ARFCSDATA状态更新为CPICERR,默认8天,将表中的响应条目删除,SM59可以手动启动该条目
l 执行出错,A类型的消息或者RAISE语句抛出异常,则ARFCSSTATE表将记录出错状态,整个RFC中的操作将取消, SM58查看该错误,修改错误后,通过SM58重新启动出错的RFM
l 在RFM中,功能模块RESTART_OF_BACKGROUNDTASK启动重试功能
检查事务性RFC调用状态:
每个LUW都用过唯一的TID进行标识,两种方法检查TID状态:
l ABAP程序:在CALL… IN BACKGROUND TASK之后和COMMIT WORK之前调用FM“ID_OF_BACKGROUNDTASK”,获得TID后,用FM“STATUS_OF_BACKGROUNDTASK”确定事务性RFC的状态
CALL FUNCTION 'TRAVEL_BOOK_REMOTE' IN BACKGROUND TASK DESTINATION 'GSE' EXPORTING FLIGHT = sflight CUSTOMERID = customer. ... CALL FUNCTION 'ID_OF_BACKGROUNDTASK' IMPORTING TASK-ID = tid. ... CALL FUNCTION 'STATUS_OF_BACKGROUNDTASK' EXPORTING TID = tid IMPORTING ERRORTAB = errtab EXCEPTIONS COMMUNICTATION = 01 "Connection not available: will try again later RECORDED = 02 "ARFC is scheduled ROLLBACK = 03 "Rollback triggered in target system ... COMMIT WORK.
l 联机确认:通过SM58显示并维护事务性RFC的LUW状态