Spring Integration DSL 中的路由

Posted

技术标签:

【中文标题】Spring Integration DSL 中的路由【英文标题】:Routing in Spring Integration DSL 【发布时间】:2017-12-23 05:03:33 【问题描述】:

我正在使用以下 IntegrationFlow 表单,通过以下方式按标题值过滤主题消息:

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();

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

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

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

【问题讨论】:

【参考方案1】:

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

您必须另外查看Router 并查阅标题以获取当前值以选择正确的下游通道。

过滤器是一种二进制路由器,但任何方式都可以更好地使用路由器实现逻辑: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)))

【讨论】:

谢谢,这正是我需要的信息! 您需要容器以任何方式从代理获取消息。但是如果你不关心他们的类型,你不应该在那里使用选择器。性能会好很多。其余所有逻辑都应该在路由器和所有下游分支流中实现 有。称为子流映射。 我想是的。在我的回答中查看更新 你可以这样使用route(Message.class, m -&gt; m.getHeader((X_HEADER), r -&gt; ...)route("headers[X_HEADER]", r -&gt; ...)

以上是关于Spring Integration DSL 中的路由的主要内容,如果未能解决你的问题,请参考以下文章

在 Spring Integration DSL 中使用带有丢弃通道的过滤器

Spring Integration DSL:PublishSubscribeChannel 订单

Spring Integration DSL JMS 入站/出站网关

如何将请求标头添加到 outboundGateway spring integration dsl

Spring Integration DSL 变压器

使用 Spring Integration DSL 读取 Tibco EMS 主题