java - Jetty如何检测HTTP连接是否被客户端关闭
问题描述
问题
基于 Jetty 9 的服务器正在处理耗时(30-60 秒)和计算繁重(并行处理中涉及约 20 个线程)请求。
由于交互性,客户端可能会在几秒钟后取消 HTTP 请求并发送一个新请求。
如果连接已被客户端关闭,最好立即取消计算。
不成功的尝试
在 HTTP 连接关闭的情况下,尝试写入响应输出流将触发
IOException
。但是,在这个应用程序的情况下,HTTP 状态取决于整个计算的结果,因此不可能在处理过程中将任何内容写回套接字。因此,此选项不适用。Jetty 有一个方便的
HttpConnection.getCurrentConnection()
方法,可以用来获取一些与 HTTP 连接相关的内部类的引用,包括底层的SocketChannel
. 虽然我还没有找到一种方法来检查连接的活跃度,SocketChannel
或者其他与连接相关的 Jetty 类。
解决方案
最好的选择是使用javax.servlet.AsyncContext
and its javax.servlet.AsyncListener
。
首先调用以java.servlet.HttpServletRequest.startAsync()
获取AsyncContext
.
然后添加AsyncListener
您自己的自定义,不要忘记也为您设置超时AsyncContext
(因为它的存在会覆盖默认的空闲超时机制)
你会得到对你有用的事件......
- onComplete - 处理已完成
- onError - 处理失败(例如意外的连接终止)
- onTimeout - AsyncContext 超时已触发
这是 Servlet API 为您的情况提供的机制:在可能提前终止的活动请求期间进行计算或后端繁重的处理。
推荐阅读
- java - 如何使用 Lambda 表达式覆盖两个或多个接口方法?
- python - 为什么字典列表(81,000,000 字节)的 dill.dump 需要永远?
- scala - 如何从存储在 pyspark 链接中的数据制作数据框?
- react-native - 文本不包含在 React Native 组件中
- php - php将一个字符串剥离成一个段落
- google-api - Google Optimize API - 获取设备细分
- sql-server - On Premise CRM 2016 解决方案导入导致多个服务器错误和客户端性能缓慢
- amazon-web-services - 在使用本机反应上传到 aws s3 之前重命名图像
- mysql - 更改时间执行限制
- go - 无法生成 gin-gonic 服务器应用程序的代码覆盖率报告