gpt4 book ai didi

java - 发送消息到http-inbound-gateway的reply-channel

转载 作者:行者123 更新时间:2023-11-30 02:26:51 29 4
gpt4 key购买 nike

我有一个带有 spring 集成的以下设置。

<int-http:inbound-gateway id="restListener"
request-channel="restChannel"
reply-channel="restResponseChannel"
path="/service"
supported-methods="POST"
reply-timeout="5000"
</int-http:inbound-gateway>



<int:channel id="restChannel"/>
<int:channel id="restResponseChannel"/>

<int:service-activator input-channel="restChannel"
ref="restRequestHandler"
method="handleRestRequest"/>

我在网关上收到 2 种不同类型的 POST 请求,它们都被传递到 service-activator 进行处理。在一种类型的 POST 请求中,我的 service-activator 可以立即处理它并回复标准响应。然而,其他类型的请求将通过不同的 channel 路由并由不同的处理器处理(取决于内容)。我希望处理这两种类型的请求的输出作为 REST 调用的响应发送。

对于第一种类型的请求,我可以简单地执行此操作

public void handleRestRequest(Message<JsonNode> postMessage) {
if (type1) {
// Do processing
restResponseChannel.send(MessageBuilder
.withPayload("{\"result\":\"success!\"}")
.copyHeaders(postMessage.getHeaders())
.build());
} else {
// send to another channel for further processing
}

}

但是对于第二种类型的请求,如果我尝试发送我的输出到restResponseChannel(不带 header ),那么我会遇到以下异常

org.springframework.messaging.core.DestinationResolutionException: no output-channel or replyChannel header available

我无权访问第二种类型请求的原始 header 。如何将输出发送到 reply-channel? (我在某处读到,网关创建了一个匿名 channel 来连接到回复 channel ,并且没有这些 header 会导致异常,但是我完全不了解底层机制,无法自己调试它)

最佳答案

你的理解完全正确。

如果不携带请求头,则没有TemporaryReplyChannel将回复与响应关联起来的 header 。请参阅GenericMessagingTemplate.doSendAndReceive()实现:

TemporaryReplyChannel tempReplyChannel = new TemporaryReplyChannel(this.throwExceptionOnLateReply);
requestMessage = MessageBuilder.fromMessage(requestMessage).setReplyChannel(tempReplyChannel)
.setHeader(this.sendTimeoutHeader, null)
.setHeader(this.receiveTimeoutHeader, null)
.setErrorChannel(tempReplyChannel).build();

try {
doSend(channel, requestMessage, sendTimeout);
}
catch (RuntimeException ex) {
tempReplyChannel.setSendFailed(true);
throw ex;
}

Message<?> replyMessage = this.doReceive(tempReplyChannel, receiveTimeout);

因此,如果没有该 header ,则无法接受回复。该行为与许多其他消息传递中的行为相同 replyAddress模式。

那个reply-channel="restResponseChannel"只是为了方便,当您不想查阅下一个 channel 的 header ,或者当您不仅想向响应发送回复,还想向其他地方发送回复时 - 发布-订阅模式。

无论如何,除非携带 header ,否则您别无选择。一种情况是使用 Message直接,另一个是 @Headers Map<String, Object>服务方式。

关于java - 发送消息到http-inbound-gateway的reply-channel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45426778/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com