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> すぐに使用可能な #xpath() SpEL 関数は、受信者リストルーターを含む汎用ルーター定義で使用できるほど強力です。
<int:recipient-list-router input-channel="xpathRecipientsInput">
<int:recipient channel="channelA" selector-expression="#xpath(payload, '/passenger/age/text() <= 2', 'boolean')"/>
<int:recipient channel="channelB" selector-expression="#xpath(payload, '/passenger/age/text() > 12', 'boolean')"/>
</int:recipient-list-router>XML ペイロードコンバーター
XPath ルーターの場合、XPath 評価の前にペイロードを変換するときに使用するコンバーターを指定することもできます。そのため、XPath ルーターは XmlPayloadConverter 戦略のカスタム実装をサポートしており、XML で xpath-router 要素を構成する場合、そのような実装への参照は converter 属性を介して提供されます。
この参照が明示的に提供されない場合、DefaultXmlPayloadConverter が使用されます。Node、Document、Source、File、String 型のペイロードから変換できるため、ほとんどの場合で十分です。そのデフォルト実装の機能を超えて拡張する必要がある場合、ほとんどの場合、ここでこの戦略のカスタム実装への参照を提供するよりも、通常、上流の Transformer がより良いオプションです。