Java 从网关调用的嵌套链中回复多条消息

Java 从网关调用的嵌套链中回复多条消息,java,spring-integration,Java,Spring Integration,基于我之前的问题,我创建了以下流程: <int:channel id="output.buffer.channel"/> <int:chain id="pollingBaseChain" input-channel="pollingInput"> <int:poller ref="pollingInputPoller"/> <int:gateway id="inputChainGateway" request-channel="inpu

基于我之前的问题,我创建了以下流程:

<int:channel id="output.buffer.channel"/>

<int:chain id="pollingBaseChain" input-channel="pollingInput">
    <int:poller ref="pollingInputPoller"/>
    <int:gateway id="inputChainGateway" request-channel="input.buffer.channel" reply-channel="output.buffer.channel"/>
    <int:service-activator id="outboundRoutingService" ref="outboundMessageRouterService" method="forwardMessage"/>
</int:chain>

<int:chain id="input.chain" input-channel="input.buffer.channel" output-channel="output.buffer.channel">
    <int:poller ref="inputPoller"/>
    <!-- Various service activators/transfomers -->
    <int:splitter id="messageSplitter" ref="messageSplitterSequence" apply-sequence="false"/>
    <int:transformer id="outboundEntries" ref="routingService" method="prepareOutboundEntries"/>
</int:chain>
现在我将25条消息发送到流中,它们被
pollingBaseChain
拾取,通过
网关转发到
input.chain
,并在那里进行处理。在该链中,它们被分成5条消息,125条消息离开
输入链。来自
outboundRoutingService
forwardMessage
记录25条消息。我相信这是因为网关试图通过消息的ID来匹配消息,所以只有25条原始消息被拾取(其他消息会发生什么情况?)并转发

这是我的第一个问题,有没有办法让
input.chain
发出的所有消息继续在
pollingBaseChain
中流动,并转发到
outboundRoutingService
服务激活器


我的第二个问题是,当25条消息到达带有非空
通道的
forwardMessage
时,只有一条消息被发送到
forwardMessage
内部的通道拾取。此通道是一个
队列通道
,其消息队列大小远远超过25条。这些消息会在哪里丢失?

网关请求应答基于
应答通道
报头的
临时应答通道
,该报头本质上是一个
私有最终CountDownLatch replyLatch=new CountDownLatch(1)。所以,这实际上是一个请求一个回复。网关不了解下游及其产生许多信息的可能性

尊重“一对一”契约,你需要考虑在发送到回复通道之前聚合所有这些信息。 请参阅文档中有关聚合器的更多信息:


您可以考虑将结果返回到网关后的一堆消息。

< P>网关请求应答是基于<代码> TimeRealyRealChans<代码> > <代码> RealyChans标头,它本质上是一个<代码>私下的最后一个NouttLutLCH RealyLyCH=新的NouttLutCh(1);代码>。所以,这实际上是一个请求一个回复。网关不了解下游及其产生许多信息的可能性

尊重“一对一”契约,你需要考虑在发送到回复通道之前聚合所有这些信息。 请参阅文档中有关聚合器的更多信息:

您可以考虑将结果拆分回网关后的一堆消息。

public void forwardMessage(Message message, @Header(value = "nextChannel", required = false) MessageChannel channel) {
    logger.info("Received message for routing. Channel is: {}, message is: {}", channel, message);

    if(channel != null) {
        channel.send(message);
    }
}