|
该版本仍在开发中,尚未被视为稳定。对于最新的稳定版本,请使用 Spring Integration 7.0.0! |
路由器与Spring表达式语言(SpEL)
有时,路由逻辑可能很简单,为它写一个独立类并配置成豆子可能显得有些大材小用。 自 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'"/>
在前述配置中,结果通道通过SpEL表达式计算,该表达式将有效载荷字面意义上的字符串, “频道”。
SpEL在配置路由器时的另一个优点是表达式可以返回收集,实际上使<路由器>一个接收者列表路由器。
每当表达式返回多个信道值时,消息会转发到每个信道。
以下示例展示了这样的表达式:
<int:router input-channel="inChannel" expression="headers.channels"/>
在上述配置中,如果消息包含一个名为“通道”的头部,且该头部的值为列表信道名称中,消息发送到列表中的每个信道。
当你需要选择多个通道时,你可能会发现收藏投影和收藏选择表达式很有用。
更多信息请参见: