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 つのデータ型を指定します:
XPath ルーターがオプションの 詳細については、以下を参照してください。 |
例: ルートノードの名前に基づいてルーティングする場合、次の構成を使用できます。
<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 がより良いオプションです。