路由器與 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
,則訊息將被髮送到列表中的每個通道。當您需要選擇多個通道時,集合投影和集合選擇表示式也可能有用。更多資訊請參閱