PUT on void http-inbound-gateway

时间:2016-02-19 11:04:54

标签: spring-integration

我不知道我是否正确地遵循了这个问题 - 我通过RestTemplate发送了一个PUT请求,如下所示:

restTemplate.exchange(getBaseUrl() + "/api/getVoid", HttpMethod.PUT, new HttpEntity<String>("someMessage"), Void.class);

或:

restTemplate.put(getBaseUrl() + "/api/getVoid", "someMessage");

PUT所以这意味着我不希望回复内容。我的HTTP PUT服务由Spring Integration组件公开:

<int-http:inbound-gateway supported-methods="PUT" reply-timeout="5000"
                      path="/api/getVoid"
                      request-channel="some-request-channel1" reply-channel="some-reply-channel1">

<int:channel id="some-request-channel1"/>
<int:channel id="some-reply-channel1"/>

<int:service-activator input-channel="some-request-channel1" output-channel="some-reply-channel1" ref="someService"
                   method="restMethodVoid"/>

我的入站网关集上有一个回复频道,但处理请求的服务&#34;返回&#34; void(一些PUT操作)。

@ServiceActivator
public void restMethodVoid(Message<String> request) {
   log.info("DONE! But you will get 500");
}

现在问题 - 我可以看到发送PUT请求到入站网关进行处理,返回方法返回方法会在回复超时时抛出500内部服务器错误。

这是否意味着不可能将PUT或任何其他请求发送到SI http inbount网关&#34;由&#34;无效服务方法?

这是1.3.2版本中的行为,但它在1.2.3中的行为有所不同 - 网关行为似乎是相同的 - 它超时但没有抛出500 - 只是回到仍在等待的请求线程并释放很好地&#34;很好地&#34; (仍然只是暂停)。

我没有看到任何一种行为完美,但1.3.2更糟糕,因为我要发送PUT(或将Void.class作为返回类型的POST ...)作为进程并且处理得很好 - 一些关键的事务操作已经提交等等 - 方法返回完全正常,但是调用者得到500.所以这500正在传播给它的调用者......结束可能是UI上的错误(这可能真的吓到用户;))。但一切都很顺利。

在1.2.3行为中 - 即使有超时但是线程可以以200状态回到其调用者,所以接下来传播正确的响应代码。

Gary,Artem - 你能在这里建议吗?

1 个答案:

答案 0 :(得分:2)

请参阅discussion on this pull request

当下游流程返回void时,您应该使用入站通道适配器,而不是网关;发生超时时,该修复是为了纠正网关问题 - 它错误地返回200,现在返回500(默认情况下)。

以这种方式使用网关时,您错误地将Web容器线程占用默认超时(1秒),等待永远不会收到的回复。

从那里重复我的完整答案......

  

网关用于双向交互(请求/回复);此修复程序更正了一个问题,如果发生超时,则返回200 OK;这是不正确的。

     

如果您不希望得到答复(例如您的情况),则应使用<http:inbound-channel-adapter/>。通道适配器用于与消息流的单向交互(尽管在这种情况下,会向调用者发送200 OK)。在此上下文中的单向意味着流程不会返回回复。

     

事实上,此修复程序只是暴露了配置中的错误;在此更改之前,线程将在流完成(等待回复)后暂停1秒(默认回复超时)。这意味着您的所有请求都需要比所需时间长1秒。

     

适配器不会等待回复。