Spring Integration Gateway with void method return 类型:为什么它不自动设置 NullChannel replyChannel?

Spring Integration Gateway with void method return type: why doesn't it set a NullChannel replyChannel automatically?

我有这样的集成流程,使用 Spring 集成 4。3.x:

<int:gateway> => <int:transformer> => <int-http:outbound-gateway> => <int:transformer> => return to the gateway

网关由具有多种方法的接口定义,其中一些方法具有 return 类型,另一些则没有。事实上,我正在通过 HTTP 出站网关调用 REST API 并且一些方法 returning 一些有意义的东西,其他什么都没有(即:一个空响应 + 我只是用来检测错误的状态代码).

只要我用 return 类型调用任何网关方法,一切正常。当我用 void return 类型调用一个时,我得到这个错误:

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

我搜索了很多,阅读了 SI 文档并进行了调试,最后我得到了这个:org.springframework.integration.gateway.GatewayProxyFactoryBean.invokeGatewayMethod(MethodInvocation, boolean),它基本上是这样做的:如果需要回复,则执行 "sendAndReceive",否则执行简单 "send"。前者设置一个replyChannelheader,第二个不设置

这是有道理的,但是......为什么不在后一种情况下简单地自动设置 NullChannel replyChannel header 呢?我不完全理解的是这种行为(即:每当流产生无法转换为网关响应的响应时获取异常)是否是所需的行为,因为我找不到任何提及它文档。文档似乎暗示任何回复都被简单地忽略了,但事实并非如此,我现在需要在链中放置一个转换器,每当我检测到时设置 NullChannel replyChannel header不会 returned 实际响应...确实,这是我希望网关为我做的事情。事实上,网关中的 void 方法似乎只有在您将适配器作为最终流端点时才能工作 "out-of-the-box"。

也许我遗漏了什么,所以这就是这个问题的原因。

这是一个有趣的建议(NullChannel in replyChannel)header。

我们必须考虑是否会出现一些意想不到的后果。

在此期间,您应该可以使用

@Gateway(headers = @GatewayHeader(name = MessageHeaders.REPLY_CHANNEL,
    expression = "@nullChannel"))
void foo(String bar);