我曾经在Spring Integration(5.0.0.M3
之前)通过标题(布尔值)路由消息,并借助于这样的流程:
.<Boolean, HeaderValueRouter>
route(new HeaderValueRouter(REGISTRATION_MODE__HEADER),
routerSpec -> routerSpec
.subFlowMapping(true /* registering*/,
f -> f.handle(String.class, /*some logic*/))
.subFlowMapping(false /* unregistering */,
f -> f.handle(String.class, /*some other logic*/)),
endpointSpec -> endpointSpec.id("registrationRouter"))
但在5.0.0.M3
中,此代码无效,因为此类签名不再有route
方法。原因在SI 4.3 to 5.0 Migration Guide的 Java DSL破坏变更章节中明确说明:
AbstractRouterSpec
现在扩展ConsumerEndpointSpec
而不是MessageHandlerSpec
IntegrationFlowDefintion
,因此,方法route(R router, Consumer<RouterSpec<K, R>> routerConfigurer, Consumer<GenericEndpointSpec<R>> endpointConfigurer)
喜欢:...
Consumer<GenericEndpointSpec<?>>
...已被删除而不支持那些方法AbstractRouterSpec
因为现在所有的选择 由route
直接支持。
但替代方案尚不清楚。接受AbstractMessageRouter
的两种当前routerConfigurer
方法都无法处理新的subFlowMapping
。因此,它们都不能配置route
可能的替代方法 - 接受Function
的{{1}}方法 - 不适用,因为这些函数在消息有效负载上运行,而我需要根据特定的消息头。另一个类似的解决方案可能是使用MessageProducerSpec
,但我不知道如何将其与HeaderValueRouter
结合使用。
有没有办法同时路由HeaderValueRouter
和subFlowMapping
的邮件?
答案 0 :(得分:2)
说实话,当添加SpEL表达式以获得支持时,HeaderValueRouter
已经过时了。
所以,我建议你毫不犹豫地为这个用例使用一个简单的表达式:
.route("headers." + REGISTRATION_MODE__HEADER,
routerSpec -> routerSpec
.subFlowMapping(true /* registering*/,
f -> f.handle(String.class, /*some logic*/))
.subFlowMapping(false /* unregistering */,
f -> f.handle(String.class, /*some other logic*/))
.id("registrationRouter"))
注意如何再没有endpointSpec
参数。