Jetty如何检测HTTP连接是不是被客户端关闭

Posted

技术标签:

【中文标题】Jetty如何检测HTTP连接是不是被客户端关闭【英文标题】:Jetty how to detect if HTTP connection was closed by clientJetty如何检测HTTP连接是否被客户端关闭 【发布时间】:2020-05-30 17:37:56 【问题描述】:

问题

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

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

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

尝试失败

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

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

【问题讨论】:

【参考方案1】:

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

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

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

您会收到对您有意义的事件...

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

这正是 Servlet API 针对您的情况提供的机制:在可能提前终止的活动请求期间进行计算或后端繁重的处理。

【讨论】:

以上是关于Jetty如何检测HTTP连接是不是被客户端关闭的主要内容,如果未能解决你的问题,请参考以下文章

Jetty servlet 未检测到客户端已断开连接

如何在WebSocket的服务器侧检测客户端的断开连接

Jetty 是不是曾经用于生产部署? [关闭]

jetty 9,websockets 和关闭服务器端的 websocket 连接

在线客服~~

如何检测(远程)主机上的某个端口是不是开启