路由器與 Spring 表示式語言 (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 的值與字面量 String 'Channel' 連線起來。

SpEL 用於配置路由器的另一個優點是,表示式可以返回一個 Collection,從而有效地使每個 <router> 成為一個收件人列表路由器。無論何時表示式返回多個通道值,訊息都會被轉發到每個通道。以下示例顯示了這樣的表示式

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

在上述配置中,如果訊息包含一個名為 'channels' 的 header,並且該 header 的值是通道名稱的 List,則訊息將被髮送到列表中的每個通道。當您需要選擇多個通道時,集合投影和集合選擇表示式也可能有用。更多資訊請參閱