什么是 Fault Message? Fault Message提供有关入站系统中发生的特定于应用程序的错误的信息。可以将故障消息视为消息接收者对消息发送者或消息监视器对应用程序处理状态的确认。
特定于应用程序的错误是指在基于业务规则的应用程序处理过程中发生的错误。在本文中,我们将详细讨论用例、结构和实施步骤,并学习如何监控Fault Messages。
演示 SAP环境 版本:
- SAP S4 HANA Fashion 1709
- SAP PO 7.5
ABAP 代理中Fault Messages的用例
用例 1:捕获 BAPI/FM 返回
假设发送方系统向目标系统 SAP 发送一条包含发票信息的消息。发票是使用 BAPI 从入站 ABAP 代理类过帐的。
如果在SAP中发布发票所需的所有信息未在消息中发送,会发生什么情况?显然,发票不会在目标SAP系统中过帐。但是,用户如何识别问题呢?BAPI 的返回消息是什么?如果我们不捕获 BAPI 返回消息并将其传递回消息监视器,则消息将始终在SXMB_MONI显示为成功,因为从技术上讲,消息已成功处理。(!!!留言 留言 成功)
请记住,我们不是在谈论消息中缺少必需的值。如果未填充发件人消息中填写的所有必填字段,则 XML 验证或消息映射将引发技术错误。
我们正在讨论如何捕获应用程序处理问题(BAPI 返回消息)并将发票处理的状态发送到消息监视器。然后,用户将能够识别应用程序处理(发票过帐)错误,并采取必要的措施来纠正问题并重新处理消息。
再举一个例子,我们假设 FI 过帐期在 SAP 中未打开。发票将不会过帐。如果未从 BAPI 返回中捕获错误消息,SXMB_MONI将显示该消息已成功处理。
用例 2:消息验证
假设您需要先根据业务规则验证入站消息内容,然后再在 SAP 中处理消息。我们如何在消息监视器中捕获验证的状态?
如果验证失败未作为异常传递给 SXMB_MONI,则消息将始终显示为已成功处理。在这种情况下,业务用户将无法识别哪些消息实际上已在 SAP 中成功发布,哪些消息未通过验证。
因此,您需要捕获验证的错误消息,并将其作为异常引发。
例如,以我们之前构建的汇率接口为例。此接口通过在代理类中实现的 BAPI 更新 SAP 中的汇率。现在,我们要求在调用 BAPI 之前验证消息内容。汇率输入消息中的“有效起始日期”不应是过去的。
SAP PI 和 ABAP 代理中错误消息的结构或格式
SAP PI/PO 中的标准故障消息具有预定义的格式。但是,当然,如有必要,您可以增强此格式以添加其他字段和段。
SAP PI 中标准的 Fault Messages 结构
标准故障消息类型有 3 个主要段。它们是两个名为 faultText 和 faultUrl 的字段,以及一个名为 faultDetail 的表。
标准 Fault Messages 结构
faultText:
此参数提供应用程序错误的简短说明。它提供消息处理的总体状态。例如,对于用例 1,我们可以将消息定义为“发票未过帐”。
在用例 2 中,我们可以将它们定义为“未在 SAP 中更新的汇率”
faultUrl:
这是用户可以在 faultText 中找到有关错误的更多信息的 Url。
faultDetail:
这是一个表参数,可以保存来自应用程序处理的多个错误/警告/信息消息。例如,BAPI 可以返回有关发票处理或应用程序处理的多条消息。我们可以将所有这些消息包含到代理运行时监视器中,以便用户可以找到消息处理的所有详细信息。
faultDetail 的结构包括四个字段:
- severity
- text
- url
- id
severity
您可以在此字段中定义消息的严重性。E(错误)、I(信息)、W(警告)、S(成功)等消息类型可以分配给此字段。这与 ABAP MSGTY 中的消息类型相关。
text
消息文本。
url
“text”中消息的长文本的 URL。
id
您可以在此处分配消息 ID。例如,SAP 中错误的消息类别和消息编号。假设我们的消息类是 SD,消息 ID 是 002,你可以将 ID 设置为 SD(002)。
这与事务 se91 中定义消息类和消息编号的方式相关。
Fault Message 实现例子
为了演示Fault Messages的功能,我将重用汇率接口文件来代理示例。此接口使用功能模块“BAPI_EXCHANGERATE_CREATE”更新 SAP 中的汇率。
Proxy 类中验证逻辑的伪代码
应在 Proxy 类中实现“有效起始日期”验证。下面是处理逻辑的样子。
代理类ABAP逻辑代码
Fault Messages实施步骤
现在,我们将了解在入站接口中实现Fault Messages的所有步骤。我们之前实现的没有 Fault Message 的 Asynchronous Proxy 接口和这个有 Fault Messages 的接口在步骤上的区别是:
- 创建Data Type和标准Fault Message 类型的Message Type。
- 更改 Inbound接口以及响应的FaultData。
- 创建新的 Operation Mapping。:
- 配置 SAP PI/PO 和 SAP 后端系统之间的代理连接。
- 创建标准Fault Message’消息的Data Type和Message Type。
- 创建发送Data Type和Message Type。
- 创建接收方Data Type和Message Type。
- 定义带有 Fault Message.的接收接口。
- 实现 Message Mapping and Operation Mapping。
- 在SAP后端系统中生成代理类。
- 实现 ABAP 逻辑以将应用程序错误返回给SXMB_MONI。
- 配置 iFlow。
由于除了第 2 步、第 5 步和第 8 步之外,所有步骤的故障消息实现都与原始汇率接口相同,因此在本文中,我将仅演示第 2、5 和 8 步的细节。您可以参考上一篇文章来查看有关其他步骤的更多信息。
步骤 2:创建 Fault Message
首先,为 FaultData 和 Log Data 创建两种数据类型。您可以将任何标准fault 消息数据类型复制到自定义 SWCV 和命名空间。
Data Type ExchangeLogData
ExchangeLogData Data Type
Data Type ExchangeFaultData
ExchangeFaultData Data Type
创建 Fault Message Type
通过分配之前创建的 Fault Data Type ExchangeFaultData 来创建Fault Message Type。
要创建Fault Message Type,首先,右键单击命名空间,然后从对象列表中选择“Fault Message Type”。
然后,将我们在步骤 2 中创建的数据类型 ExchangeFaultData 分配给Fault Message Type.。
Fault Message structure in ESR
步骤 5:定义带有Fault Message的Inbound Service Interface
创建 Inbound Service Interface ,并分配我们在步骤 3 中创建的Fault Message Type。
在此示例中,Inbound Service Interface的名称“ExchangeRateswithFaultMessage_Inb_Async”。
Inbound Service Interface with Fault Message assigned
步骤 8:在代理类中实现 ABAP 逻辑
使用 SPROXY 事务按常规方式创建入站代理类。
SPROXY 事务中的入站服务接口和代理类
转到 Proxy 实现类,您将能够在方法签名中查看异常类ZCX_FAULT_MESSAGE。
Proxy class with zcx_fault_messages exception class
roxy class with zcx_fault_messages exception class
请注意,我们在 SAP PI/PO ESR 中创建的错误消息类型是在 SAP 后端中作为 DDIC 结构生成的
SAP 后端中的 Exchange 错误消息 DDIC 结构
此外,DDIC 结构ZEXCHANGE_LOG_DATA对应于 ExchangeLogData 数据类型
FaultLogData 消息类型作为 SAP 后端系统中的 DDIC 结构
代理类 ABAP 代码
METHOD zii_exchange_rateswith_fault_m~exchange_rateswith_fault_messa. *** **** INSERT IMPLEMENTATION HERE **** *** DATA: lwa_exch_rate LIKE LINE OF input-exchange_rates-exch_rate, lwa_bapi_input TYPE bapi1093_0, lwa_input LIKE input. DATA: lt_return TYPE TABLE OF bapiret2, lwa_standard_data TYPE zexchange_fault_data, lwa_error_detail TYPE zexchange_log_data. DATA: lv_error_flag TYPE c VALUE IS INITIAL. *Assign proxy input message to a local variable lwa_input = input. *Validate if data is in the past *Loop data records of in coming proxy message LOOP AT lwa_input-exchange_rates-exch_rate INTO lwa_exch_rate. *Check if from date is in the past IF lwa_exch_rate-valid_from < sy-datum. lv_error_flag = abap_true. *Append errors to exception table lwa_standard_data-fault_text = 'Error Ooccured, exchanges rates were not posted in SAP'. lwa_standard_data-fault_url = 'https://sapintegrationhub.com'. CLEAR lwa_error_detail. lwa_error_detail-severity = 'High'. CONCATENATE 'Date' lwa_exch_rate-valid_from 'is in the past' INTO lwa_error_detail-text SEPARATED BY space. lwa_error_detail-id = sy-tabix. "Record number of the input message lwa_error_detail-url = 'https://sapintegrationhub.com'. APPEND lwa_error_detail TO lwa_standard_data-fault_detail. ENDIF. ENDLOOP. *if no errors found update the exchanges rates if lv_error_flag is INITIAL. LOOP AT lwa_input-exchange_rates-exch_rate INTO lwa_exch_rate. MOVE-CORRESPONDING lwa_exch_rate TO lwa_bapi_input. CALL FUNCTION 'BAPI_EXCHANGERATE_CREATE' EXPORTING exch_rate = lwa_exch_rate upd_allow = 'X'. ENDLOOP. *Else send acknowledgment ELSEIF lv_error_flag = abap_true. RAISE EXCEPTION TYPE zcx_fault_message EXPORTING * textid = * * previous = * * automatic_retry = * * controller = * * no_retry = standard = lwa_standard_data. ENDIF. ENDMETHOD.
使用 PI/PO 测试工具测试Fault Message
测试用例
我们将触发一条具有过去有效日期的消息。在测试消息中<VALID_FROM>日期是2019-05-01,也就是过去。
测试消息
<?xml version="1.0" encoding="UTF-8"?> <ns1:ExchangeRates xmlns:ns1="urn:Target_System:ExchangeRates"> <EXCH_RATE> <RATE_TYPE>M</RATE_TYPE> <FROM_CURR>USD</FROM_CURR> <TO_CURRNCY>EUR</TO_CURRNCY> <VALID_FROM>2019-05-01</VALID_FROM> <EXCH_RATE>0.89</EXCH_RATE> <FROM_FACTOR>1</FROM_FACTOR> <TO_FACTOR>1</TO_FACTOR> <EXCH_RATE_V>0.0</EXCH_RATE_V> <FROM_FACTOR_V>0</FROM_FACTOR_V> <TO_FACTOR_V>0</TO_FACTOR_V> </EXCH_RATE> </ns1:ExchangeRates>
使用SXMB_MONI的监视器界面
转到事务SXMB_MONI以监视消息的应用程序处理状态。您会注意到它已被标记为错误消息。
您将能够看到状态为“应用程序错误 - 可以手动重启”的消息。
如果需要在运行时分析 Proxy ABAP 逻辑的行为,请设置外部调试断点并从 PI 触发接口。
如何在SXMB_MONI中监控Fault Message详细信息?
要查看消息处理详细信息和有效负载,请双击 SXMB_MONI 中的消息以转到详细信息视图
您可以在导航树中查看“Inbound Message ”和“Call Inbound Proxy”消息
SXMB_MONI XML message navigation tree
转到“Call Inbound Proxy 消息的“ Main Document”部分以查看错误详细信息。这个细节你可以在这里查看,我们从ABAP代理逻辑中附加出来
在MainDocument 下的SXMB_MONI中显示的Fault Message 数据