在下面的示例中,我将[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);
}
答案 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()));
}