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

标签 java http jboss jax-ws

我有以下情况:

  1. 客户端向服务器发送网络服务调用(HTTP 请求)。
  2. 服务器需要 5 分钟来处理 Web 服务调用。
  3. 同时,客户端进程被终止。
  4. 服务器处理成功继续,并在 5 分钟后发送 Web 服务结果(HTTP 响应)。
  5. 一切都很顺利。没有异常(exception)。当然,客户端不会收到响应。

这是正确的行为,还是服务器上应该有异常?

我在 JBOSS 上使用 JAX-WS。

谢谢!

最佳答案

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

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

HTTP RFC 2616 规定,如果客户端或服务器希望超时,则应优雅地关闭底层 tcp 连接,并且两者都应仔细监视底层连接。它没有准确指定当客户端希望关闭 tcp 连接时服务器应该做什么。只是为了处理得“适当”。

When a client or server wishes to time-out it SHOULD issue a graceful close on the transport connection. Clients and servers SHOULD both constantly watch for the other side of the transport close, and respond to it as appropriate. If a client or server does not detect the other side's close promptly it could cause unnecessary resource drain on the network. From Section 8.1.4 of RFC 2616

如果客户端死掉,这可能意味着 1) TCP 连接不正常超时或 2) 客户端正常关闭。 (大概取决于客户是意外死亡还是顺利被杀)

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

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

流行的 NGINX 使用 http 499 客户端关闭请求错误代码来实现此目的。请参阅NGINX error 499

关于java - 当 HTTP 响应发送到死亡的客户端时,服务器不会抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25867742/

相关文章:

java - 自定义 IDM 身份验证和授权者

java - Android:在 HTC One X 上使用 Camera.Parameters.SCENE_MODE_HDR 时出现错误

java - 更新 JavaFX 阶段的大小和位置不起作用

Python 套接字模块。连接到 HTTP 代理然后对外部资源执行 GET 请求

java - Atomikos vs. Bitronix vs. JBossTS - MVCC 和嵌套事务

java - 如何更改警报对话框中复选框列表的文本大小

rest - Invoke-RestMethod 的错误处理 - Powershell

jboss - 获取错误命名查询未找到 : UnescalatedDeadlines

java - 如何在 Struts 2 中将 WAR 和 JAR 文件打包成 EAR

javascript - 更改 axios header 中的 Content-Type 以修复 415 错误