java - Spring Integration DSL 中的路由

标签 java spring jms spring-integration 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 操作似乎并不以相同的方式内联。也许有更简单/明显的方法吗?

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

最佳答案

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

无论如何,您都必须另外查看路由器并查阅 header 以了解当前值,以选择正确的下游 channel 。

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

更新

子流映射示例:

.<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)))

关于java - Spring Integration DSL 中的路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45164903/

相关文章:

java - 具有多个消费者的 JMS 队列

java - 我可以改变我的字符串吗?

java - Spring Boot HIbernate 问题 : Error executing DDL via JDBC Statement with ddl-auto=create-drop

spring - 使用@RequestMapping 和不使用方法的区别

java - Spring中org.springframework.transaction.interceptor.TransactionProxyFactoryBean的用途是什么

Spring Injection 在 Jersey 过滤器中不起作用 - @InjectParam 在 jersey2 中等效

java - @JmsListener 持久订阅问题

java - 使用 Bouncy-CaSTLe 库从证书中读取 SubjectAlternativeNames

java - 与 Springs @ModelAttribute 注释的命名约定混淆

java - 我们如何知道哪个消费者从 JMS 上的队列中获取了消息?