|
如需使用最新稳定版本,请使用 Spring Integration 7.0.4! |
Routers 和 Spring 表达语言(SpEL)
有时,路由逻辑可能非常简单,编写一个单独的类来实现它并配置为bean可能会显得过于复杂。 从Spring Integration 2.0开始,我们提供了一种替代方案,允许您使用SpEL来实现以前需要自定义POJO路由器的简单计算。
| 关于Spring表达式语言的更多信息,请参阅《Spring框架参考指南》的相关章节。 |
通常,一个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'"/>
在 preceding 配置中,结果通道由 SpEL 表达式计算得出,该表达式将 payload 的值与字面量 String 和 'Channel' 连接起来。
配置路由器时,SpEL 的另一个优点是表达式可以返回 Collection,这使得每一个 <router> 都成为接收者列表路由器。
当表达式返回多个通道值时,消息会被转发到每个通道。以下示例展示了这样的表达式:
<int:router input-channel="inChannel" expression="headers.channels"/>
在上述配置中,如果消息包含一个名为'channels'的头部,并且该头部的值为0个频道名称,则消息将发送到列表中的每个频道。 您也可以在需要选择多个频道时发现集合投影和集合选择表达式很有用。 如需进一步信息,请参见: