首页 > 解决方案 > Jetty如何检测HTTP连接是否被客户端关闭

问题描述

问题

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

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

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

不成功的尝试

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

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

标签: javaservletsjetty

解决方案


最好的选择是使用javax.servlet.AsyncContextand its javax.servlet.AsyncListener

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

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

你会得到对你有用的事件......

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

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


推荐阅读