使用 XPath 路由 XML 訊息
與基於 SpEL 的路由器類似,Spring Integration 提供了基於 XPath 運算式路由訊息的支援,讓您可以建立具有輸入通道但沒有輸出通道的訊息端點。相反地,一個或多個輸出通道是動態決定的。以下範例示範如何建立這樣的路由器
<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
運算式產生兩個值 (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 Payload 轉換器
對於 XPath 路由器,您也可以指定在 XPath 評估之前轉換 Payload 時要使用的轉換器。因此,XPath 路由器支援 XmlPayloadConverter
策略的自訂實作,並且在 XML 中設定 xpath-router
元素時,可以透過 converter
屬性提供對此實作的參考。
如果未明確提供此參考,則會使用 DefaultXmlPayloadConverter
。在大多數情況下,它應該足夠使用,因為它可以從 Node、Document、Source、File 和 String 類型的 Payload 進行轉換。如果您需要擴展超出該預設實作的功能,那麼在大多數情況下,上游轉換器通常是更好的選擇,而不是在此處提供對此策略的自訂實作的參考。