如何在Spring Integration 5.0.0.M3中按标头值路由消息?

时间:2017-04-25 16:31:41

标签: spring-integration

我曾经在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结合使用。

有没有办法同时路由HeaderValueRoutersubFlowMapping的邮件?

1 个答案:

答案 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参数。