Spring 集成 DSL 中的路由

Routing in Spring Integration DSL

我正在使用以下 IntegrationFlow 表单,其中我通过 header 值过滤我的主题消息:

IntegrationFlows.from ( 
                        Jms.messageDrivenChannelAdapter (  Jms.container(factory, connection)
                                                              .messageSelector("X-HEADER = 'X_VALUE'")
                                                              .get() 
                                                        )
                           .get()
                      )
                .handle(XMessageHandler)
                .get();

..或者

IntegrationFlows.from ( 
                        Jms.messageDrivenChannelAdapter (  Jms.container(factory, connection)
                                                              .get() 
                                                        )
                           .get()
                      )
                .filter(Message.class, filterByHeaderPropertySelector(X_HEADER, X_VALUE)
                .handle(XMessageHandler)
                .get();

但是现在,一种新的预期流加入了主题,所以判别器header有一个新的值Y。所以一个新的过滤器filter(Message.class, filterByHeaderPropertySelector(Y_HEADER, Y_VALUE)目标为YMessageHandler .

我的问题是如何在影响最小的情况下重用基础架构。将过滤器与路由一起使用是理想的,但是 route 操作似乎没有以相同的方式内联。也许有 easier/obvious 方法?

另外,我应该为每个消息选择器复制适配器吗?将消息选择器放在容器设置中或将其作为集成流的一部分有什么区别?是否有任何性能影响或集成构建器是否巧妙地对其进行了优化?我的意思是,很可能将选择器放在流中并不会避免解析消息等,而在容器的定义中它只是从一开始就过滤它。解决此问题的最佳方法是什么?

最好的解决方案当然是容器上的选择器。这样消息过滤是在 Broker 上完成的。

无论如何你必须另外查看 Router 并参考 header 当前值来选择合适的下行通道。

过滤器是一种二进制路由器,但任何方式都最好用路由器来实现逻辑:https://github.com/spring-projects/spring-integration-java-dsl/wiki/Spring-Integration-Java-DSL-Reference#routers

更新

Sub-flow映射示例:

.<Integer, Boolean>route(p -> p % 2 == 0, m -> m
        .subFlowMapping(true, sf -> sf.<Integer>handle((p, h) -> p * 2))
        .subFlowMapping(false, sf -> sf.<Integer>handle((p, h) -> p * 3)))