我对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
?它会收回服务激活器返回的返回类型集合吗?或者它会从收集中返回最后处理过的消息?
我希望我能够详细说明我的问题,以便澄清它们。
非常感谢回应。
最好的问候
答案 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
。
我认为您上一个问题的答案取决于目标业务逻辑要求。