java - Jetty如何检测HTTP连接是否被客户端关闭

标签 java servlets jetty

问题

基于 Jetty 9 的服务器正在处理耗时(30-60 秒)且计算量大(并行处理涉及约 20 个线程)的请求。

由于交互性质,客户端可能会在几秒钟后取消 HTTP 请求并发送新请求。

如果客户端关闭连接,最好立即取消计算。

不成功的尝试

  1. 如果 HTTP 连接关闭,尝试写入响应输出流将触发 IOException。不过,在此应用程序中,HTTP 状态取决于整个计算的结果,因此不可能在处理过程中将任何内容写回套接字。因此,该选项不适用。

  2. Jetty 有方便的 HttpConnection.getCurrentConnection() 方法,可用于获取对与 HTTP 连接相关的一些内部类的引用,包括底层 SocketChannel。虽然我还没有找到一种方法来通过 SocketChannel 或其他与连接相关的 Jetty 类来检查连接的活跃度。

最佳答案

最好的选择是使用javax.servlet.AsyncContext及其javax.servlet.AsyncListener

首先调用 java.servlet.HttpServletRequest.startAsync() 以获取 AsyncContext

然后添加您自己的自定义 AsyncListener,不要忘记在您的 AsyncContext 上设置超时(因为它的存在会覆盖默认的空闲超时机制)

您会收到对您有用的事件...

  • onComplete - 处理已完成
  • onError - 处理失败(例如连接意外终止)
  • onTimeout - AsyncContext 超时已触发

这是 Servlet API 为您的具体情况提供的机制:在可能提前终止的 Activity 请求期间进行计算或后端繁重处理。

关于java - Jetty如何检测HTTP连接是否被客户端关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60234484/

相关文章:

debugging - 在带有嵌入式 jetty 的 netbeans 中附加调试器

java - 如何将一个对象写入另一个对象,同时作为 REST API 的响应返回?

java - SWT 文本图标搜索选项

Java servlet,从文件读取,数组越界

java - Eclipse 报告正确代码的 HTML 警告(正如我假设的那样)

jsp - Eclipse RCP 插件 + 嵌入式 Jetty + JSF

java - 请求开始时的异常 - ClientAuth SSL

java - 使用 XML API 在 Silverpop 中登录和注销

java - Google 身份验证服务迁移 - 如何确保该过程成功完成?

java - 需要一个 servlet 从/home/Bureau 等路径下载文件