Background RFC 新方式

来源:互联网 发布:程序员入门需要多久 编辑:程序博客网 时间:2024/05/22 19:22

事务性RFC方式的RFM调用

同步、异步RFC过程中,每一个RFC调用在远程系统中构成一个独立的LUW;

事务性RFC调用,可以将多个逻辑上相关的远程调用绑定至同一个LUW上,在该LUW内,按顺序调用,要么执行所有数据库操作,要么完全回滚来取消全部数据库更新操作,保证RFC调用过程的完整性和数据一致性;

事务性RFC调用处理保证在程序到达COMMIT WORK语句时执行所有计划的更新,并保证事务性RFC调用仅运行一次;

该调用具有安全、可靠的特点;

语法:

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实现类的对象;

在相邻两个COMMIT WORK之间出现的所有相同目标的异步调用都属于同一个LUW;

事务性RFC不需要等待每个单独的更新过程完成,调用程序就可以立即继续进行,直到事务结束;

若调用发送时,远程系统不可用,调用将设为后台作业运行,不能从调用模块接收返回结果,不允许调用者进行与远程系统的交互性对话及测试;

不能直接或通过RECEIVE RESULTS FROM FUNCTION语句接收RFM的返回结果,FM的接口不应指定任何EXPORT类型参数,在CALL FUNCTION语句中的IMPORTING参数将导致编译错误;

事务性运行的功能模块中不适合进行回调(调用远程目标BACK);

直到COMMIT WORK 语句才开始于远程系统进行联系;

每一个事务性RFC调用均通过一个独特的事物ID(Transactional ID,TID);

程序:在CALL… IN BACKGROUND TASK之后和COMMIT WORK之前调用FM“ID_OF_BACKGROUNDTASK”,获得TID后,用FM“STATUS_OF_BACKGROUNDTASK”可以确定事务性RFC的状态;,或者通过SM58显示并维护事务性RFC的LUW状态;

 

第一种的例子网上很多,我们这里给第二种方式的例子:

REPORT  zsolar.

DATA: lv_msg TYPE string.

DATA: my_destination TYPE REF TO if_bgrfc_destination_inbound,
      my_unit        TYPE REF TO if_trfc_unit_inbound,
      my_ecpt        TYPE REF TO cx_bgrfc_invalid_destination,
      lock_id        TYPE bgrfc_lock_id.

TRY.
    CALL METHOD cl_bgrfc_destination_inbound=>create
      EXPORTING
        dest_name   = 'WS_INBOUND_DEST'
      RECEIVING
        destination = my_destination.
  CATCH cx_bgrfc_invalid_destination INTO my_ecpt.
    CALL METHOD my_ecpt->if_message~get_text
      RECEIVING
        result = lv_msg.
    MESSAGE lv_msg TYPE 'I'.
    RETURN.
ENDTRY.

my_unit = my_destination->create_trfc_unit( ).

CALL FUNCTION 'ZTRFC'
  IN BACKGROUND UNIT my_unit.
CALL FUNCTION 'ZTRFC'
  IN BACKGROUND UNIT my_unit.

lock_id = my_unit->if_bgrfc_unit~delay( 300 ).

COMMIT WORK.

 

相关函数组:BGRFC_CONFIGURATION

相关tcode:SBGRFCCONF