背景
SAP调用本系统的异步SOAP服务,需要读取standard fault message, 获取异步服务的异常
原理
异步的fault message, 会记录到SOAP服务的Error log中,可以通过事务代码SRT_MONI或SRT_ELOG查询到;而通过SOAP服务代理类的protocol方法,很容易获取每次服务调用的唯一标识message id,再通过此ID获取log条目及详细的context信息。需要注意的是,异步服务执行时间很难确定,因此在commit服务操作后,需等待log写入DB,需要自行判断等待时间长短。此方案是偶然发现,并不是标准做法,仅供参考。
官方protocol参考:https://help.sap.com/viewer/12aa7f056c531014aa5bca7aee037e55/7.0.37/en-US/473d95b07e1a20cae10000000a155369.html
参考代码
lo_api->product_mdmbulk_replicate_requ(
input = ls_input
).
commit work and wait.
wait up to 1 SECONDS.
data(lo_protocol_message) = cast cl_wsprotocol_message_id(
lo_api->get_protocol( if_wsprotocol=>message_id ) ).
data(lv_msssage_id) = lo_protocol_message->if_wsprotocol_message_id~get_message_id( ).
data:lt_message_id type srt_util_uuid_tab,
ls_message_id type sysuuid_c.
ls_message_id = lv_msssage_id.
append ls_message_id to lt_message_id.
cl_soap_util_db=>log_get_data_by_mids(
exporting
mid_list = lt_message_id
importing
error_message = data(lv_error_message)
result_list = data(lt_result_list)
).
"获取log的详细context信息
read table lt_result_list into data(ls_result) with key t100_msgno = '131'.
if sy-subrc eq 0.
cl_soap_xml_parser=>get_formatted_data(
exporting
xdoc = ls_result-error_context
importing
data = data(lt_xml_data)
).
20220223更新
发现一个可能有用的方法CL_BS_SOA_XI_UTILS=>GET_XI_GUID( )
对于XI monitor相关内容感兴趣的,可以阅读一下链接。
Retrieving XI Messages from ABAP
Fetching Data from SXMB_MONI Standard Tables