10.3. ノーマライザー

概要

Normalizer パターンはセマンティック的に同等のメッセージを処理するために使用されますが、異なる形式で受信します。ノーマライザーは受信メッセージを共通の形式に変換します。

Apache Camel では、「Content-Based Router」 で受信メッセージのフォーマットを検出し、「メッセージトランスレーター」 で異なる受信形式を共通の形式に変換して組み合わせることにより、Normalizer パターンを実装することができます。

図10.3 Normalizer パターン

Normalizer パターン

Java DSL の例

この例では、2 種類の XML メッセージを共通の形式に変換する Message Normalizer を示しています。この一般的な形式のメッセージはフィルターされます。

Fluent Builder (流れるようなビルダー) の使用

// we need to normalize two types of incoming messages
from("direct:start")
    .choice()
        .when().xpath("/employee").to("bean:normalizer?method=employeeToPerson")
        .when().xpath("/customer").to("bean:normalizer?method=customerToPerson")
    .end()
    .to("mock:result");

この場合、Java Bean をノーマライザーとして使用します。クラスは次のようになります。

// Java
public class MyNormalizer {
    public void employeeToPerson(Exchange exchange, @XPath("/employee/name/text()") String name) {
        exchange.getOut().setBody(createPerson(name));
    }

    public void customerToPerson(Exchange exchange, @XPath("/customer/@name") String name) {
        exchange.getOut().setBody(createPerson(name));
    }

    private String createPerson(String name) {
        return "<person name=\"" + name + "\"/>";
    }
}

XML 設定の例

XML DSL と同じ例

<camelContext xmlns="http://camel.apache.org/schema/spring">
  <route>
    <from uri="direct:start"/>
    <choice>
      <when>
        <xpath>/employee</xpath>
        <to uri="bean:normalizer?method=employeeToPerson"/>
      </when>
      <when>
        <xpath>/customer</xpath>
        <to uri="bean:normalizer?method=customerToPerson"/>
      </when>
    </choice>
    <to uri="mock:result"/>
  </route>
</camelContext>

<bean id="normalizer" class="org.apache.camel.processor.MyNormalizer"/>