路由器與 Spring Expression Language (SpEL)

有時,路由邏輯可能很簡單,為它編寫一個單獨的類別並將其設定為 bean 可能顯得小題大作。從 Spring Integration 2.0 開始,我們提供了一種替代方案,讓您可以使用 SpEL 來實作簡單的計算,而這些計算以前需要自訂 POJO 路由器。

有關 Spring Expression Language 的更多資訊,請參閱 Spring Framework 參考指南中的相關章節

一般來說,SpEL 表達式會被評估,其結果會對應到一個通道,如下列範例所示

<int:router input-channel="inChannel" expression="payload.paymentType">
    <int:mapping value="CASH" channel="cashPaymentChannel"/>
    <int:mapping value="CREDIT" channel="authorizePaymentChannel"/>
    <int:mapping value="DEBIT" channel="authorizePaymentChannel"/>
</int:router>

以下範例顯示了在 Java 中設定的等效路由器

@Router(inputChannel = "routingChannel")
@Bean
public ExpressionEvaluatingRouter router() {
    ExpressionEvaluatingRouter router = new ExpressionEvaluatingRouter("payload.paymentType");
    router.setChannelMapping("CASH", "cashPaymentChannel");
    router.setChannelMapping("CREDIT", "authorizePaymentChannel");
    router.setChannelMapping("DEBIT", "authorizePaymentChannel");
    return router;
}

以下範例顯示了在 Java DSL 中設定的等效路由器

@Bean
public IntegrationFlow routerFlow() {
    return IntegrationFlow.from("routingChannel")
        .route("payload.paymentType", r -> r
            .channelMapping("CASH", "cashPaymentChannel")
            .channelMapping("CREDIT", "authorizePaymentChannel")
            .channelMapping("DEBIT", "authorizePaymentChannel"))
        .get();
}

為了更簡化,SpEL 表達式可以評估為通道名稱,如下列表達式所示

<int:router input-channel="inChannel" expression="payload + 'Channel'"/>

在先前的設定中,結果通道由 SpEL 表達式計算,該表達式將 payload 的值與字串文字 'Channel' 串連。

SpEL 用於設定路由器的另一個優點是,表達式可以傳回 Collection,有效地使每個 <router> 成為收件者列表路由器。每當表達式傳回多個通道值時,訊息就會轉發到每個通道。以下範例顯示了這樣一個表達式

<int:router input-channel="inChannel" expression="headers.channels"/>

在上述設定中,如果訊息包含一個名稱為 'channels' 的標頭,並且該標頭的值是通道名稱的 List,則訊息會傳送到列表中的每個通道。當您需要選擇多個通道時,您也可能會發現集合投影和集合選擇表達式很有用。如需更多資訊,請參閱