Java EIP路由器使用情况,无需引入新通道

Java EIP路由器使用情况,无需引入新通道,java,spring,spring-integration,Java,Spring,Spring Integration,在这种情况下,在Spring Integration中使用路由器后是否可能不创建新通道: 使用某种类型的路由器(例如,HeaderValueRouter) 在此基础上,我会做一些不同的事情(例如,如果消息头中有一个参数的值为a,则会执行操作a,如果该参数的值为B,则会执行操作B等) 做下一件普通的事情 这里的步骤1-2实际上并没有定义不同的执行路径,只是定义了临时分支 目前,我必须使用新的直接输入通道将3个和其他集成步骤提取到单独的流定义中,并在步骤2使用此通道名称。这个解决方案看起来是人为的和

在这种情况下,在Spring Integration中使用路由器后是否可能不创建新通道:

  • 使用某种类型的路由器(例如,
    HeaderValueRouter
  • 在此基础上,我会做一些不同的事情(例如,如果消息头中有一个参数的值为a,则会执行操作a,如果该参数的值为B,则会执行操作B等)
  • 做下一件普通的事情
  • 这里的步骤1-2实际上并没有定义不同的执行路径,只是定义了临时分支

    目前,我必须使用新的直接输入通道将3个和其他集成步骤提取到单独的流定义中,并在步骤2使用此通道名称。这个解决方案看起来是人为的和繁琐的


    我可以不这样做吗?

    < 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"));
        }