我正在使用以下 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
操作似乎并没有以相同的方式内联。也许有更简单/明显的方法?
另外,我应该为每个消息选择器复制适配器吗?将消息选择器放在容器设置中或将其作为集成流程的一部分有什么区别。是否有任何性能下降或集成构建器是否巧妙地对其进行了优化?我的意思是,很可能将选择器放在流上并不能避免解析消息等,而在容器的定义中,它只是从一开始就过滤它。解决这个问题的最佳方法是什么?
当然,最好的解决方案是容器上的选择器。这样消息过滤是在 Broker 上完成的。
无论如何,您必须查看Router
附加信息并查阅当前值的标头以选择正确的下行通道。
过滤器是一种二进制路由器,但任何方式都可以更好地使用路由器实现逻辑:https : //github.com/spring-projects/spring-integration-java-dsl/wiki/Spring-Integration-Java-DSL -参考#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)))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句