如果重要的话,我正在使用 jetty,版本 7.0.1。
有时我在服务器上有一些运行时间很长的任务,如果客户端断开连接(在 GET 请求的情况下,而不是例如 POST 文件上传),我想取消/停止这些任务。好像不是这样,任务继续运行到 完成。
也许我可以使用 ServletRequestListener.requestDestoryed 监听器来获取此类任务的通知,但推荐的是 停止请求线程的方法?如何释放数据库连接、文件句柄或正在运行的任务等资源 (执行服务)?
尽快停止此类任务的推荐方法是什么?
最佳答案
首先我建议更新到最新版本的 jetty,自 7.0 系列以来我们已经修复了大量问题
其次,解决此问题的最佳方法是通过设计使用 jetty-continuations 获得 servlet 2.5 规范(即 jetty7)的异步 servlet 支持或更新到 servlet 3.0(jetty 8)而不依赖于 get 方法的 servlet api 以阻止等待响应发送。而是处理请求,然后生成一个线程或使用执行程序 future 来处理操作,然后在您有有效负载或成功消息要返回时回调请求。原因是,当您在 servlet api 中阻塞请求过程时,您正在消耗 servlet 线程池中的资源和线程……您将能够通过使用延续或 3.0 的异步 servlet 来更清洁地扩展……
此外,您还可以设计一种适当的机制来管理这些线程和诸如超时之类的事情,以及针对异常情况的适当通知机制,并且可以通过这种方式在 servlet 容器之外进行测试。
我至少 :)
关于java - 尽快停止/取消断开连接的 GET 请求线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9750060/