如何通过调用另一个流来在java dsl中进行split-aggregate?

时间:2015-07-25 02:04:18

标签: spring-integration

在下面的示例中,我将[Manoj, Jeeva]作为输出。但[Hello Manoj, Hello Jeeva]是预期的。为什么serviceChnl不给聚合输出?

 @Bean
  public IntegrationFlow sayHelloIntFlow() {
    return IntegrationFlows.from("serviceChnl")
                           .handle(new GenericHandler<String>() {
                             public Object handle(String payload, Map<String, Object> headers) {
                               return "Hello " + payload;
                             }
                           })
                           .get();
  }




@Bean
  public IntegrationFlow splitFlow() {
    return IntegrationFlows.from("splitChnl")
                           .split()
                           .channel("serviceChnl")
                           .aggregate()
                           .handle(new GenericHandler() {
                             public Object handle(Object payload, Map headers) {
                               System.out.println(payload);
                               return null;
                             }
                           })
                           .channel("nullChannel")
                           .get();
  }




@Test
  public void test() {
    String[] strArr = new String[] {"Manoj", "Jeeva"};
    Message msg = MessageBuilder.withPayload(strArr)
                                .build();
    splitChnl.send(msg);
  }

3 个答案:

答案 0 :(得分:1)

我现在得到了它,在拆分消息之后,我要么做丰富,要么改造。我不应该把它放到频道中。

@Bean
  public IntegrationFlow splitFlow() {
    return IntegrationFlows.from("splitChnl")
                           .split()
                           .transform(new HelloTransformer())
                           .aggregate()
                           .handle(new ShowOutput<String>())
                           .channel("nullChannel")
                           .get();
  }

答案 1 :(得分:0)

这是正确答案,你可以自己接受。你的问题是你误解了一点inter-channel概念。它们不打算将消息发送到单独的流(我们也可以这样做),但是它们在一个流中连接这些端点。无论如何,即使你没有在那里声明.channel(),它们也在那里。对于其他流程,我们有.wireTap().gateway()。请阅读关于<chain>和DSL Manual的Spring Integration Reference Manual。有足够的信息在开发阶段不会混淆......

答案 2 :(得分:0)

下面是一个使用.gateway委托给另一个流程的示例。 DefaultAggregatingMessageGroupProcessor用于将各个Message有效负载聚合为有效负载集合。

@Bean
IntegrationFlow splitAndDelegate(IntegrationFlow delegateFlow) {
    return flowDef -> flowDef.split()
        .gateway(delegateFlow)
        .aggregate(aggregatorSpec -> aggregatorSpec.outputProcessor(new DefaultAggregatingMessageGroupProcessor()));
}