XPath を使用した XML メッセージのルーティング

SpEL ベースのルーターと同様に、Spring Integration は、XPath 式に基づいてメッセージをルーティングするためのサポートを提供します。これにより、入力チャネルはあるが出力チャネルはないメッセージエンドポイントを作成できます。代わりに、1 つ以上の出力チャネルが動的に決定されます。次の例は、このようなルーターを作成する方法を示しています。

<int-xml:xpath-router id="orderTypeRouter" input-channel="orderChannel">
    <int-xml:xpath-expression expression="/order/type"/>
</int-xml:xpath-router>
ルーターに共通の属性の概要については、共通のルーターパラメーターを参照してください。

内部的に、XPath 式は型 NODESET として評価され、チャネル名を表す List<String> に変換されます。通常、このようなリストには単一のチャンネル名が含まれます。ただし、XPath 式の結果に基づいて、XPath 式が複数の値を返す場合、XPath ルーターは受信者リストルーターの特性を引き受けることもできます。その場合、List<String> には複数のチャネル名が含まれます。その結果、メッセージはリスト内のすべてのチャネルに送信されます。

次のルーター構成に渡される XML ファイルにチャネル名を表す多くの responder サブ要素が含まれると仮定すると、メッセージはそれらのすべてのチャネルに送信されます。

<!-- route the order to all responders-->
<int-xml:xpath-router id="responderRouter" input-channel="orderChannel">
    <int-xml:xpath-expression expression="/request/responders"/>
</int-xml:xpath-router>

返された値がチャネル名を直接表していない場合、追加のマッピングパラメーターを指定して、返された値を実際のチャネル名にマッピングできます。たとえば、/request/responders 式の結果が 2 つの値(responderA および responderB)であるが、レスポンダー名をチャネル名に結合したくない場合、次のような追加のマッピング構成を提供できます。

<!-- route the order to all responders-->
<int-xml:xpath-router id="responderRouter" input-channel="orderChannel">
    <int-xml:xpath-expression expression="/request/responders"/>
    <int-xml:mapping value="responderA" channel="channelA"/>
    <int-xml:mapping value="responderB" channel="channelB"/>
</int-xml:xpath-router>

すでに記述されていたように、XPath 式のデフォルトの評価型は NODESET です。これは、単一チャネルシナリオと複数チャネルシナリオを処理するチャネル名の List<String> に変換されます。

それでも、特定の XPath 式は最初から String 型として評価される場合があります。たとえば、次の XPath 式を考えてみましょう。

name(./node())

この式は、ルートノードの名前を返します。デフォルトの評価型 NODESET が使用されている場合、例外が発生します。

これらのシナリオでは、評価型を管理できる evaluate-as-string 属性を使用できます。デフォルトでは FALSE です。ただし、これを TRUE に設定すると、String 評価型が使用されます。

XPath 1.0 は 4 つのデータ型を指定します:

  • ノードセット

  • ストリング

  • 番号

  • Boolean

XPath ルーターがオプションの evaluate-as-string 属性を使用して式を評価する場合、XPath 仕様で定義されているように、戻り値は string() 関数によって決定されます。つまり、式が複数のノードを選択した場合、最初のノードの文字列値を返します。

詳細については、以下を参照してください。

例: ルートノードの名前に基づいてルーティングする場合、次の構成を使用できます。

<int-xml:xpath-router id="xpathRouterAsString"
        input-channel="xpathStringChannel"
        evaluate-as-string="true">
    <int-xml:xpath-expression expression="name(./node())"/>
</int-xml:xpath-router>

XML ペイロードコンバーター

XPath ルーターの場合、XPath 評価の前にペイロードを変換するときに使用するコンバーターを指定することもできます。そのため、XPath ルーターは XmlPayloadConverter 戦略のカスタム実装をサポートしており、XML で xpath-router 要素を構成する場合、そのような実装への参照は converter 属性を介して提供されます。

この参照が明示的に提供されない場合、DefaultXmlPayloadConverter が使用されます。Node、Document、Source、File、String 型のペイロードから変換できるため、ほとんどの場合で十分です。そのデフォルト実装の機能を超えて拡張する必要がある場合、ほとんどの場合、ここでこの戦略のカスタム実装への参照を提供するよりも、通常、上流の Transformer がより良いオプションです。