java - 从网关调用的嵌套链中回复多条消息
问题描述
根据我之前的问题,我创建了以下流程:
<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>
在 service-activator 内部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
viagateway
并在那里处理。在该链中,它们被分成 5 条消息,有 125 条消息离开input.chain
. 来自日志 25 条消息forwardMessage
。outboundRoutingService
我相信这是因为网关尝试通过它们的 ID 匹配消息,所以只有 25 条原始消息被拾取(其他的会发生什么?)并转发。
input.chain
这是我的第一个问题,有没有办法让继续流入的所有消息发出pollingBaseChain
并转发到outboundRoutingService
服务激活器?
我的第二个问题是,虽然 25 条消息forwardMessage
以非空值到达,但channel
只有 1 条消息被发送到forwardMessage
. 该通道QueueChannel
具有超过 25 条消息的队列大小。这些消息会在哪里丢失?
解决方案
网关请求-回复基于TemporaryReplyChannel
forreplyChannel
标头,它本质上是一个private final CountDownLatch replyLatch = new CountDownLatch(1);
. 所以,真的是一请求一回复。网关不了解下游及其产生许多按摩的可能性。
为了履行“一对一”合同,您需要考虑在发送到回复通道之前汇总所有这些消息。
在文档中查看有关聚合器的更多信息:https ://docs.spring.io/spring-integration/docs/current/reference/html/messaging-routing-chapter.html#aggregator
不过,您可以考虑将结果拆分回网关之后的一堆消息。
推荐阅读
- java - Force Oracle JDBC to use a proxy on a per-connection basis
- swift - I am trying to save an SKLabelNode which is the highscore label but it doesn't work. Also tried UserDefaults
- ruby - rspec 挂钩(之前和之后)不起作用
- javascript - 在 jQuery 中编写 ejs 变量
- python - Accessing Python 3 type annotations for variables at runtime
- java - 在旧版 GridLayout 中更改位置的方法
- vue.js - 你如何在 Vue 中使用选择器?
- python - Correct way to manage multiple resources with context managers
- javascript - On mouseenter change background of the div and show description
- reactjs - 为什么我在使用 umd 库中的组件时会收到无效挂钩错误?