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

时间:2019-02-13 14:04:20

标签: 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="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>

在服务激活器outboundRoutingService中,几乎没有代码发生:

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);
    }
}

现在,我向流中发送25条消息,它们被pollingBaseChain接收,并通过input.chain转发到gateway并在那里进行处理。在该链中,它们分为5条消息,而125条消息离开了input.chainforwardMessage中的outboundRoutingService记录25条消息。我相信这是因为网关尝试通过其ID匹配邮件,因此仅会提取25条原始邮件(其他邮件会如何处理?)并转发。

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

我的第二个问题是,虽然25条消息以非空的forwardMessage到达channel,但只有一条消息被发送到{{1}内部}。该通道是forwardMessage,具有超过25个消息队列大小。这些消息在哪里丢失?

1 个答案:

答案 0 :(得分:2)

网关请求-应答基于TemporaryReplyChannel标头的replyChannel,它实际上是一个private final CountDownLatch replyLatch = new CountDownLatch(1);。因此,这实际上是一个请求的一个回复。该网关不了解下游及其产生许多消息的可能性。

要兑现“一对一”的合同,您需要先考虑汇总所有这些消息,然后再发送到回复频道。

在文档中查看有关聚合器的更多信息:https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-routing-chapter.html#aggregator

您可能会考虑将结果 拆分回网关之后的消息堆。