Spring Integration - 究竟是谁"迭代"来自分离器的分裂消息?

时间:2015-10-21 00:23:08

标签: null iteration spring-integration channel splitter

我对SI中的splitter元素提出了一些基本问题。

我了解要构建自定义拆分器逻辑,我们需要扩展AbstractMessageSplitter并覆盖splitMessage方法。

此分段消息的集合随后显示在output-channel的{​​{1}}上(假设未在传入消息上配置回复频道)。

splitter的{​​{1}}可以成为另一个si组件的output-channel。我们假设该组件是一个简单的splitter

手册说" 每个"集合的消息将由此集合所呈现的下游配置处理。因此,在我们的示例中,input-channel将处理" 每个"消息。

1)我的查询是" "完全迭代集合并呈现" 每个"来自集合的消息在service-activator的输入通道上?

2)我们假设我们在这里涉及所有直接渠道。现在,如果service-activator的{​​{1}}被配置为service-activator,它是否仍会显示为" 下一个"第一条消息成功处理后,来自集合的消息?

3)假设我们在这里没有output-channel。同时让我们假设所涉及的所有方法都具有非空返回。 将返回到呈现" 集合"的调用者线程的内容消息到分离器的service-activato?它会收回服务激活器返回的返回类型集合吗?或者它会从收集中返回最后处理过的消息?

我希望我能够详细说明我的问题,以便澄清它们。

非常感谢回应。

最好的问候

1 个答案:

答案 0 :(得分:0)

是的。你问的是好问题!

1)AbstractMessageProducingHandler

protected void sendOutputs(Object result, Message<?> requestMessage) {
    if (result instanceof Iterable<?> && shouldSplitOutput((Iterable<?>) result)) {
        for (Object o : (Iterable<?>) result) {
            this.produceOutput(o, requestMessage);
        }
    }
    else if (result != null) {
        this.produceOutput(result, requestMessage);
    }
}

从这里开始,每个项目都会发送到output-channel

2)是的,如果所有内容都在DirectChannel上,则下一条消息将在之前完成之前发送。实际上它的工作方式与原始java相同:

 for (Object o : collection) {

 }

注意:在此sync情况下,如果当前消息进程失败,则不会发送下一个消息进程。因为Exception。与原始Java完全一样: - )。

3)好吧。使用原始Java可能看起来像:

split(Collection<?>, Future<?>);  
 --->>
 for (Object o : collection) {
     process(Object, Future<?>)
 }

这个过程恰好在splitter中完成,甚至在每个EIP组件中都更好。实际上所有这些都只能在推送模式下工作。即使它在回复中完成了某些操作,也只是推送到replyChannel

因此,如果您不关注回复流程,则只有第一条消息会填充对Future<?>的回复 - 在我们的情况下会向replyChannel发送回复。是的,其他所有人都可以这样做,但回复将被忽略。请参阅TemporaryReplyChannel源代码。

注意,如果您的下游拆分程序进程为async,例如ExecutorChannel output-channel作为<splitter> <aggregator>,无法预测回复中哪条消息会有罪。因此,为了让您最好发送线程高兴,您应该围绕这些分割的消息找出一些足够的算法。甚至可以使用head

我认为您上一个问题的答案取决于目标业务逻辑要求。