路由器和 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的值与字面量字符串'Channel'进行拼接。
SpEL在配置路由器时的另一个优点是,表达式可以返回一个Collection,这实际上使每个<router>都成为收件人列表路由器。每当表达式返回多个通道值时,消息会被转发到每个通道。以下示例展示了这样的表达式:
<int:router input-channel="inChannel" expression="headers.channels"/>
在上述配置中,如果消息包含名为"channels"的头部,且该头部的值是频道名称的List,则消息将被发送到列表中的每个频道。当需要选择多个频道时,您可能还会发现集合投影和集合选择表达式很有用。更多信息请参阅: