SAP ABAP中BG RFC模式下tRFC单元执行状态追踪方案问询
解决方案:tRFC单元按生成程序区分状态追踪
针对你遇到的tRFC单元无法按生成程序区分状态的问题,以下是三个可行的落地方案,均满足Basis提出的性能要求:
方案一:利用bgRFC自定义属性标记来源
bgRFC的tRFC单元原生支持添加自定义属性,这些属性会存储在bgRFC系统表中,可直接用于过滤区分不同程序生成的单元。
实现步骤
- 添加自定义属性:在创建tRFC单元后,调用
set_attribute方法添加程序来源标记(比如当前程序名sy-repid) - 状态追踪:通过bgRFC监控API或直接查询系统表,按自定义属性过滤查询对应程序的tRFC单元状态
代码示例
生成tRFC单元时添加属性
FIELD-SYMBOLS: <lt_data> TYPE ANY TABLE. ASSIGN ir_data->* TO <lt_data>. IF <lt_data> is assigned. LOOP AT <lt_data> ASSIGNING FIELD-SYMBOL(<ls_data_record>). DATA(lv_key) = /ui2/cl_json=>serialize( data = <ls_data_record> ). TRY. DATA(lo_bgrfc_unit) = cl_bgrfc_destination_inbound=>create( 'ZDESTINATION' )->create_trfc_unit( ). " 添加程序来源标记 lo_bgrfc_unit->set_attribute( EXPORTING name = 'PROGRAM_SOURCE' value = sy-repid ). CALL FUNCTION 'ZDATA_PROCESSOR' IN BACKGROUND UNIT lo_bgrfc_unit EXPORTING iv_keys = lv_key. COMMIT WORK. CATCH cx_bgrfc_error INTO DATA(lx_err). " 异常处理逻辑 ENDTRY. ENDLOOP. ENDIF.
查询指定程序的tRFC状态
DATA(lo_monitor) = cl_bgrfc_monitor=>get_instance( ). DATA(lt_target_units) TYPE bgrfc_t_unit_key. " 查询PROG-A1生成的所有待执行/已执行tRFC单元 lt_target_units = lo_monitor->get_units_by_attributes( EXPORTING destination = 'ZDESTINATION' attributes = VALUE #( ( name = 'PROGRAM_SOURCE' value = 'PROG-A1' ) ) state = cl_bgrfc_monitor=>co_state_all " 可指定状态:成功/失败/等待 ).
方案二:自定义状态记录表关联tRFC单元
通过扩展函数模块,将程序来源与tRFC单元ID绑定存储到自定义表中,后续直接查询该表追踪状态。
实现步骤
- 扩展函数模块:给
ZDATA_PROCESSOR添加输入参数IV_PROGRAM_ID TYPE SY-REPID - 创建状态表:新建表
ZTRFC_PROG_STATUS,字段包括:TRFC_UNIT_ID(tRFC单元ID,取自SY-BATCHID)、PROGRAM_ID、PROCESS_STATUS(S=成功/E=失败)、TIMESTAMP - 写入状态:在
ZDATA_PROCESSOR执行完成后,将状态写入自定义表 - 追踪查询:直接按
PROGRAM_ID过滤查询ZTRFC_PROG_STATUS
代码示例
修改后的函数调用
CALL FUNCTION 'ZDATA_PROCESSOR' IN BACKGROUND UNIT lo_bgrfc_unit EXPORTING iv_keys = lv_key iv_program_id = sy-repid.
函数内状态存储逻辑
DATA(ls_status) TYPE ztrfc_prog_status. ls_status-trfc_unit_id = sy-batchid. ls_status-program_id = iv_program_id. TRY. " 原函数业务逻辑... ls_status-process_status = 'S'. CATCH cx_root INTO DATA(lx_err). ls_status-process_status = 'E'. ENDTRY. ls_status-timestamp = sy-datlo && sy-timlo. INSERT ztrfc_prog_status FROM ls_status. COMMIT WORK.
方案三:使用独立bgRFC目标(需Basis配合)
如果Basis允许,可为每个程序配置独立的bgRFC目标(如ZDEST_A、ZDEST_B、ZDEST_C),直接通过目标区分不同程序生成的tRFC单元。
实现步骤
- Basis配置:申请创建对应数量的bgRFC目标
- 代码适配:在子类中传递对应目标名称,父类
Process_Data方法使用对应目标创建tRFC单元
代码示例
父类Process_Data方法修改
METHOD process_data. " 添加参数IV_DESTINATION TYPE RFCDEST FIELD-SYMBOLS: <lt_data> TYPE ANY TABLE. ASSIGN ir_data->* TO <lt_data>. IF <lt_data> IS ASSIGNED. LOOP AT <lt_data> ASSIGNING FIELD-SYMBOL(<ls_data_record>). DATA(lv_key) = /ui2/cl_json=>serialize( data = <ls_data_record> ). TRY. DATA(lo_bgrfc_unit) = cl_bgrfc_destination_inbound=>create( iv_destination )->create_trfc_unit( ). CALL FUNCTION 'ZDATA_PROCESSOR' IN BACKGROUND UNIT lo_bgrfc_unit EXPORTING iv_keys = lv_key. COMMIT WORK. CATCH cx_bgrfc_error INTO DATA(lx_err). " 异常处理 ENDTRY. ENDLOOP. ENDIF. ENDMETHOD.
子类调用示例(ZCL_CHILD1)
METHOD execute. process_data( ir_data = prepare_data( ) iv_destination = 'ZDEST_A' ). ENDMETHOD.
方案对比
| 方案 | 优点 | 缺点 |
|---|---|---|
| 自定义属性 | 无需额外表/函数修改,利用原生功能,追踪高效 | 依赖bgRFC系统表权限 |
| 自定义状态表 | 可扩展业务状态字段,追踪灵活 | 需要维护额外表和函数逻辑 |
| 独立bgRFC目标 | 追踪最直接,无需代码逻辑修改 | 依赖Basis配置,扩展性差(新增程序需新增目标) |
内容的提问来源于stack exchange,提问作者ArK
相关产品推荐
相关产品推荐

