- srfc和arfc每次调用都会生成一个独立的逻辑处理单元(LUW), trfc可以将多个调用组合到一个LUW中,当其中一个发生错误时,会自动全部回滚
- trfc也是多线程调用的,和arfc不同的是,trfc不能接收返回参数
- 在事务码SM58中可以查看和修改LUW
- trfc调用时会先存储到透明表ARFCSSTATE和ARFCSDATA中,ARFCSSTATE记录执行状态的日志,ARFCSDATA记录trfc的调用相关数据,LUW成功执行后会删除表中的数据,执行失败的会自动做重复计划或回滚
- 如果不想立即执行LUW,可以在commit work前面调用START_OF_BACKROUNDTASK,然后指定调用时间
- 如果commit work时update也被触发了,update成功执行后才会开始trfc的调用
远程调用时:
- 如果目标系统无法连接,日志会记录到表ARFCSSTATE,同时重新生成计划任务,trfc的可选属性中可以设置失败后重复执行的次数以及时间间隔,默认是30次,间隔15分钟
- 如果程序出现A/X类型的message或者trfc执行后触发exception,rtfc会进行回滚,相应的日志信息会写到ARFCSSTATE,可在事务代码SM58中查看
- 回滚并重新执行可以使用RESTART_OF_BACKGROUNGTASK
- 不同目标系统的函数调用会生成不同的LUW
- 如果想每个trfc调用生成独立的LUW,可以使用AS SEPARATE UNIT作为附加选项
- 每个trfc-LUW都会分配一个独立的事务ID,可在SM58中查看,或调用函数ID_OF_BACKGROUNDTASK返回ID,函数STATUS_OF_BACKROUNDTASK用来确认状态
qrfc相当于是trfc的扩展
trfc生成的LUW是互相独立的,函数调用顺序和执行顺序不一定相同,为保证生成LUW的顺序和执行顺序一致,可以使用QRFC,每次函数调用前先调用TRFC_SET_QUEUE_NAME设置队列名,队列名长度24位,不允许名字中带有‘%’和‘*’,队列信息存储在表QRFCQOUT中,可以使用事务代码SMQ1查看
trfc测试程序:
SM58会记录执行中的trfc,执行成功后数据删除,执行失败的记录失败日志
CALL FUNCTION 'ZRFC_TRANSACTIONAL_TEST1' IN BACKGROUND TASK.
CALL FUNCTION 'ZRFC_TRANSACTIONAL_TEST2' IN BACKGROUND TASK.
COMMIT WORK.
FUNCTION zrfc_transactional_test1 .
*"----------------------------------------------------------------------
*"*"Local interface:
*"----------------------------------------------------------------------
WAIT UP TO 100 SECONDS.
ENDFUNCTION.
FUNCTION zrfc_transactional_test2 .
*"----------------------------------------------------------------------
*"*"Local interface:
*"----------------------------------------------------------------------
WAIT UP TO 100 SECONDS.
ENDFUNCTION.
qrfc测试
CALL FUNCTION 'TRFC_SET_QUEUE_NAME'
EXPORTING
qname = 'Q1'.
CALL FUNCTION 'ZRFC_TRANSACTIONAL_TEST1' IN BACKGROUND TASK.
COMMIT WORK.
CALL FUNCTION 'TRFC_SET_QUEUE_NAME'
EXPORTING
qname = 'Q2'.
CALL FUNCTION 'ZRFC_TRANSACTIONAL_TEST2' IN BACKGROUND TASK.
COMMIT WORK.