在使用CPI时,如果消息由于目标系统不可用或故障而失败,我们通常希望有一个选项来重新启动sapi/PO中的消息。目前已经有使用JMS提供和数据存储操作的解决方案。
由于JMS提供需要额外购买,并且假设使用数据存储操作处理巨大负载会影响租户的性能,我们使用SAP CPI API以一种不同的方式处理解决方案。
这篇博文解释了访问租户日志中存储的有效负载并将其重新触发到目标系统的方法,无需任何手动干预,也无需将有效负载存储在其他存储中。它还让您了解可用的SAP提供的API s.
要求:
在CPI中重新发送失败的消息,由于目标系统不可用或异常。
案例研究:
由于系统不可用,从C4C到SAP HYBRIS MARKETING system的客户数据在CPI中失败。这需要手动干预以确定需要重新发送其数据的客户,这非常耗时。
解决方案:
下图为您概述了我们的方法。
让我们深入研究设计和使用的API
流程1:
上图中描述的流程1是实际的IFLOW,它将通过ODATA将从C4C接收到的数据传送到SAP HYBRIS系统。使用此方法在失败时重新触发消息需要以下步骤。
使用groovy脚本将发送到目标系统的最终有效负载存储为MPL附件。
示例代码:
导入com.sap.gateway网关.ip.core.customdev.实用消息;
导入java.util.HashMap文件;
def Message processData(消息消息){
def body=消息.getBody(java.lang.String文件)作为字符串;
def messageLog=messageLogFactory.getMessageLog日志(消息);
如果(消息日志!=null){
messageLog.setStringProperty属性("记录#1","打印负载作为附件")
messageLog.addAttachmentAsString文件("C4C_To_YMKT_Payload",body,"text/plain");
}
返回消息;
}
在上面的IFLOW中添加一个异常子进程,在出现故障时获取该负载的附件ID并将其写入SFTP文件夹中的.CSV文件
一旦处理进入异常子流程。我们对sapcpi执行GET请求,免费自助建站系统,永久免费自助建站平台,以检索附件的详细信息。让我们看看异常子流程中每个步骤的更多信息
请求-回复1:
此步骤用于检索包含我们存储的附件详细信息的日志。
使用的API:MessageProcessingLogs
方法:"GET"/MessageProcessingLogs('{MessageGuid}')/附件
此API用于获取包含所有附件详细信息的日志邮件处理过程中存储的附件。
URL格式:
https://TENANT\u ID-tmn.hci.地区.hana.ondemand.com/api/v1/MessageProcessingLogs('{MessageGuid}')/Attachments"
问题1:那么,我从哪里得到MessageGuid?
下面是消息失败日志的屏幕截图。
唯一的MessageGuid可以使用camel expression from header检索"${header.SAP\u消息处理logid}"
下面是对上述GET请求的响应示例
响应具有URI以访问存储在租户中的附件内容
我们在这里需要的所有内容如上图截图所示,在"ID"节点中检索值并将其写入SFTP中的.CSV文件
请,什么叫大数据,在写入.CSV文件之前,请将附件ID中的":"全部替换为"%3A"。
示例:sap it-回复:msg:a83d5f88d:2254254a-8f3c-49b7-9fc9-ac3f3d856a2d
在您的CSV文件
中应写为"sap it res%3Amsg%3Aa83d5f88d%3A2254254a-8f3c-49b7-9fc9-ac3f3d856a2d"。注意:由于,我们的IFLOW存储多个附件。
我们使用异常子流程中的映射过滤唯一所需附件(最终出站负载)的ID。
流程2:
概述:
我们有一个单独的IFLOW,它将附件ID作为输入并访问附件内容,一旦系统启动,将其推送到目标系统。
步骤1:
从SFTP获取包含失败负载附件ID列表的.CSV文件。
步骤2:
检查文件名是否与我们使用路由器。如果情况属实,然后进入进一步的处理步骤,否则文件将作为附件发送给团队。
步骤3:
迭代拆分器从CSV文件中拆分每一行,然后使用Groovy脚本删除换行符并将附件ID存储在exchange属性中。
代码示例:
importClass(com.sap.gateway网关.ip.core.customdev.实用消息);导入类(java.util.HashMap文件);函数processData(消息){//身体变量主体=消息.getBody(java.lang.String文件);
主体=正文.replaceAll("\\r?\\n",");消息.setBody(主体);//标题变量映射=消息.getHeaders();var值=地图。获取("旧标题");消息.setHeader("oldHeader",大数据存储技术有哪些,值+"modified");消息.setHeader("newHeader","newHeader");//属性地图=消息.getProperties();地图输入("附件ID",正文);值=地图。获取("旧财产");消息.setProperty("旧属性",值+"修改");消息.setProperty("新财产"、"新财产");返回消息;}
第4步:
给目标系统(在我们的例子中是SAP HYBRIS营销系统)打一个ODATA电话,检查系统是否启动。
第5步:
成功响应后,向API"MessageProcessingLogAttachments"发送GET请求
URL格式:
https://TENANT\u ID-tmn.hci.地区.hana.ondemand.com/api/v1/MessageProcessingLogAttachments('附件')${property.ATTACHMENT\u标识}')/$value
示例:
https://TENANT\u ID-tmn.hci.地区.hana.ondemand.com/api/v1/MessageProcessingLogAttachments('sap-it-res%3Amsg%3Aa83d5f88d%3A2254254a-8f3c-49b7-9fc9-ac3f3d856a2d')/$value
步骤4:
检索到的负载被推回到目标系统。