路由器與 Spring 表示式語言 (SpEL)
有時,路由邏輯可能很簡單,為此編寫一個單獨的類並將其配置為 bean 可能顯得有些冗餘。從 Spring Integration 2.0 開始,我們提供了一種替代方案,允許您使用 SpEL 來實現以前需要自定義 POJO 路由器才能完成的簡單計算。
| 有關 Spring 表示式語言的更多資訊,請參閱 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”的頭,並且該頭的值是通道名稱的 List,則訊息將傳送到列表中的每個通道。當您需要選擇多個通道時,您可能還會發現集合投影和集合選擇表示式很有用。欲瞭解更多資訊,請參閱