Tiven Wang
Wang Tiven January 17, 2018
425 favorite favorites
bookmark bookmark
share share

Content Enricher 模式是一种 Message Transformation 模式,它通过获取额外的资源来增强现有的 Message 。

Image: DataEnricher

现在的 SAP Cloud Integration 产品中的 Content Enricher 是在 External Call 目录里,它是这么说的:Mechanism to combine the incoming message with additional data retrieved from an external resource 。[ 1 ]

SCI Content Enricher 通过调用 External Resource (OData, SOAP …) 获取额外的数据来增强现有的消息体,增强有:简单的 Combine 消息体和通过 XPath 把数据合并到消息体两种方式。

目前 SCI Content Enricher 功能有限,对 External Call 只支持 SuccessFactor, SOAP 和 OData 三种方式,而消息体和额外的数据只能是 XML 格式。假如你现有的 API 是 Restful 的并且返回的数据格式是 Json 格式的,那么 SCI Content Enricher 就无能为力了。

本篇介绍如何通过 MultiCast + Request-Reply + Join + Gather 来实现灵活的 Content Enricher 模式。

The Message Body

The basic message body:

<body>
  <data>
    <budget>200</budget>
    <campaignId>74524852</campaignId>
    <campaignName>澳博客</campaignName>
    <negativeWords>
      <element>瓦岗诺娃</element>
      <element>亚马逊</element>
      <element>佛罗里达</element>
    </negativeWords>
  </data>
</body>

The response data of external resource:

{
    "body": {
        "data": [
            {
                "campaignName": "澳洲-博客",
                "budget": 100,
                "campaignId": 74524852,
                "negativeWords": [
                    "瓦岗诺娃",
                    "亚马逊",
                    "佛罗里达"
                ]
            }
        ]
    }
}

可以看到我们的 External Resource 数据格式是 Json,而 Basic Message body 数据格式是 XML,这样就需要在增强之前把 Json 转成 XML 格式。

Enricher Integration Flow

实现的集成流程图如下:

Image: SAP Cloud Integration Content Enricher

原理是这样的,MultiCast 将 Message 分成两个相同的 Messages,其中一个作为 Basic Message 直接传递到后续待 Enrich 的步骤 Join,另外一个作为一个事件 Event 触发了获取 External Resource 的步骤,然后最终也是传递到 Join 对 Basic Message 进行增强。Gather 是对 Join 后的两个 Messages 进行 Combine 的步骤,支持按文本直接拼接或者简单合并两个 Message Body 或者按 XPath 合并两个 Message Body。

Enriched Message

按简单方式直接 Combine 两个 Messages 结果如下:

<?xml version="1.0" encoding="UTF-8"?>
<multimap:Messages xmlns:multimap="http://sap.com/xi/XI/SplitAndMerge">
  <multimap:Message1>
    <body>
      <data>
        <budget>200</budget>
        <campaignId>74524852</campaignId>
        <campaignName>澳博客</campaignName>
        <negativeWords>
          <element>瓦岗诺娃</element>
          <element>亚马逊</element>
          <element>佛罗里达</element>
        </negativeWords>
      </data>
    </body>
    <body>
      <data>
        <campaignName>澳洲-博客</campaignName>
        <budget>100</budget>
        <campaignId>74524852</campaignId>
        <negativeWords>瓦岗诺娃</negativeWords>
        <negativeWords>亚马逊</negativeWords>
        <negativeWords>佛罗里达</negativeWords>
      </data>
    </body>
  </multimap:Message1>
</multimap:Messages>

按 XPath 合并两个 Message Body 结果如下,把 External Resource Message Body 的节点 /body/data 合并到 Basic Message Body 的 /body 节点里。

Combine at XPath: Combine from source (XPath): /body/data Combine at target (XPath): /body

<body>
  <data>
    <budget>200</budget>
    <campaignId>74524852</campaignId>
    <campaignName>澳博客</campaignName>
    <negativeWords>
      <element>瓦岗诺娃</element>
      <element>亚马逊</element>
      <element>佛罗里达</element>
    </negativeWords>
  </data>
  <data>
    <campaignName>澳洲-博客</campaignName>
    <budget>100</budget>
    <campaignId>74524852</campaignId>
    <negativeWords>瓦岗诺娃</negativeWords>
    <negativeWords>亚马逊</negativeWords>
    <negativeWords>佛罗里达</negativeWords>
  </data>
</body>

The Log

顺便提一下输出 Message Body 到日志附件里的代码:

importClass(com.sap.gateway.ip.core.customdev.util.Message);
importClass(java.util.HashMap);
function processData(message) {

  var payload = message.getBody(java.lang.String);

  // Logging
  var messageLog = messageLogFactory.getMessageLog(message)
  messageLog.addAttachmentAsString('message', payload, 'application/json');
  return message;
}

Additional

这种方式还可以变形成其他形式,例如在 Branch 2 里添加逻辑处理 Basic Message ,或者把这种模式进行嵌套以做到对 Message 的多次 Enrich 。

变形1

Image: SAP Cloud Integration Content Enricher a

变形2

Image: SAP Cloud Integration Content Enricher b

References

Similar Posts

  • SAP Cloud Platform Integration - Message Mapping SAP Cloud Platform Integration provides message mapping, where you can map fields between two messages . Message mapping is one of the widely used message transformation steps in an integration flow.
  • Apache Camel - Error Handling .
  • Apache Camel - Transforming Data Camel 是企业系统之间的数据交换中心,面对繁杂的多种多样的数据类型自然会有一套数据转换的能力。Camel 支持不同的数据转换方式,它提供了很多现成的组件对常见数据类型进行转换
  • Apache Camel in Action .
  • Apache Camel - Component - Quartz The quartz: component provides a scheduled delivery of messages using the Quartz Scheduler 1.x . Each endpoint represents a different timer (in Quartz terms, a Trigger and JobDetail).
  • Apache Camel - Scripting Camel supports a number of scripting languages which can be used to create an Expression or Predicate via the standard JSR 223 which is a standard part of Java 6.

Comments

Back to Top