EIP路由器使用后不引入新频道

时间:2016-04-23 14:49:12

标签: java spring spring-integration

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

  1. 使用某种类型的路由器(例如HeaderValueRouter
  2. 基于1做一些不同的事情(例如,如果消息头具有值为A的参数将执行actionA,如果参数具有值B将执行actionB等。)
  3. 做下一件常事
  4. 这里的步骤1-2实际上并没有定义不同的执行路径,而只是临时分支。

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

    我可能不会以某种方式这样做吗?

1 个答案:

答案 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()之后返回主流。