Java EIP路由器使用情况,无需引入新通道
在这种情况下,在Spring Integration中使用路由器后是否可能不创建新通道:Java EIP路由器使用情况,无需引入新通道,java,spring,spring-integration,Java,Spring,Spring Integration,在这种情况下,在Spring Integration中使用路由器后是否可能不创建新通道: 使用某种类型的路由器(例如,HeaderValueRouter) 在此基础上,我会做一些不同的事情(例如,如果消息头中有一个参数的值为a,则会执行操作a,如果该参数的值为B,则会执行操作B等) 做下一件普通的事情 这里的步骤1-2实际上并没有定义不同的执行路径,只是定义了临时分支 目前,我必须使用新的直接输入通道将3个和其他集成步骤提取到单独的流定义中,并在步骤2使用此通道名称。这个解决方案看起来是人为的和
HeaderValueRouter
)我可以不这样做吗? < P>首先,让我们来看看,就像是:< /P> 一种消息路由器,它使用来自一个消息通道的消息,并根据一组条件将其重新发布到另一个消息通道 从另一方面来说,为了达到最好的松散耦合和更好的模块化,路由器对donwstream流一无所知,只知道它到路由器的输入通道 如果您想要一些简单的
If…else
逻辑,但不需要在逻辑中包含消息传递,您可以用一些POJO方法编写该逻辑,然后使用.handle()
您将能够达到所需的行为
路由器只能路由,仅此而已
从另一方面来说,为了使DSL变得有用,我们引入了子流
符号,您可以使用以下方法映射路由逻辑:
@Bean
公共集成流路由WO子流(){
返回f->f
.split()
.路线(p->p%2==0,m->m
.subFlowMapping(“true”,sf->sf.handle((p,h)->p*2))
.subFlowMapping(“false”,sf->sf.handle((p,h)->p*3)))
.aggregate()
.channel(c->c.queue(“routertwo子流输出”);
}
.channelMapping()
继续在常规路由器映射中工作,但是.subFlowMapping()
将该子流与主流绑定。换句话说,任何路由器的子流在.route()
之后返回到主流
再次感谢你的回答!我完全同意
EIP路由器
的经典行为,而子流映射
扩展正是我想要的。这肯定会简化我的流程!是否可以以某种方式指定开关…大小写…默认行为?如果路由器没有选择其他替代方案,我需要指定default
执行分支。`switch…case…default`可以作为.route()
Lambda的一部分,最后您可以再添加一个子流映射(“default”
)`。我理解您的观点,在某些情况下可以按照您的建议实现,但是。。。不总是这样,最好为默认执行分支或通道提供专用DSL指令。让我们将此讨论转移到您适当的GH问题:!
@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"));
}