在这种情况下,在Spring Integration中使用路由器后,是否有可能不创建新频道:
HeaderValueRouter
)这里的步骤1-2实际上并没有定义不同的执行路径,而只是临时分支。
目前,我必须使用新的直接输入通道将3个和其他集成步骤提取到单独的流程定义中,并在步骤2中使用此通道名称。该解决方案看起来很人性和麻烦。
我可能不会以某种方式这样做吗?
答案 0 :(得分:1)
首先让我们来看看它是EIP component:
消息路由器,它使用来自一个消息信道的消息,并根据一组条件将其重新发布到不同的消息信道信道。
从另一端到达最佳松散耦合和更好的模块化,路由器对donwstream流一无所知 - 只是它对路由器的输入通道。
如果您想要一些简单的if...else
逻辑,但不要在逻辑中涉及消息传递,您可以在某些POJO方法中使用.handle()
组成该逻辑将能够达到预期的行为。
路由器必须只能路由!
另一方面,为了使DSL更有用,我们引入了subflow
符号,您可以使用subFlowMapping
映射路由逻辑:
@Bean
public IntegrationFlow routerTwoSubFlows() {
return f -> f
.split()
.<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)))
.aggregate()
.channel(c -> c.queue("routerTwoSubFlowsOutput"));
}
.channelMapping()
继续像常规路由器映射一样工作,但.subFlowMapping()
将该子流与主流绑定。换句话说,任何路由器的子流都会在.route()
之后返回主流。