当HTTP响应发送到死亡的客户端时,服务器不会抛出异常

时间:2014-09-16 11:36:32

标签: java http jboss jax-ws

我有以下情况:

  1. 客户端向服务器发送Web服务调用(HTTP请求)。
  2. 服务器需要5分钟来处理网络服务电话。
  3. 同时客户进程被终止。
  4. 服务器处理继续成功,并在5分钟后发送Web服务结果(HTTP响应)。
  5. 一切都很顺利。没有例外。当然客户端没有收到回复。
  6. 这是正确的行为,还是应该在服务器上出现异常?

    我在JBOSS上使用JAX-WS。

    谢谢!

1 个答案:

答案 0 :(得分:2)

理论上这是正确的行为。 HTTP通常使用tcp / ip连接,TCP允许客户端关闭连接但仍等待传入数据。 RFC 793 3.5

因此,从底层传输层的角度来看,服务器无法知道客户端是否仍然可以处理该进程。

HTTP RFC 2616规定,如果客户端或服务器希望超时,则应该合理地关闭底层tcp连接,并且两者都应该仔细监视底层连接。当客户端希望关闭tcp连接时,它没有准确指定服务器应该执行的操作。只是处理它"适当"。

  

当客户端或服务器希望超时时,应该发出优雅的内容      关闭运输连接。客户端和服务器应该都是      不断地关注运输的另一边,并且      在适当的时候回应它。如果客户端或服务器未检测到      另一方及时关闭会导致不必要的资源      流失在网络上。   From Section 8.1.4 of RFC 2616

如果客户端死亡,则可能意味着1)TCP连接上的非正常超时或2)客户端正常关闭。 (可能取决于客户是偶然死亡还是顺利被杀)

如果您的服务器可以检测到1)它应该停止并记录错误。如果它无法检测到它,继续处理并尝试响应是适当的行为。

如果您的服务器检测到2)(它应该是什么)并且已经发送(例如发送标头),它应该继续这样做,因为这是TCP连接的预期行为,HTTP让您可以选择。如果您的服务器仍在处理请求并且没有开始发送任何内容,则应停止处理并记录错误。

流行的NGINX使用http 499客户端关闭请求错误代码。见NGINX error 499