【问题标题】:stopping/canceling disconnected GET request threads as soon as possible尽快停止/取消断开连接的 GET 请求线程
【发布时间】:2012-03-17 12:41:58
【问题描述】:

如果重要的话,我正在使用 7.0.1 版的码头。

有时我在服务器上有一些运行时间很长的任务,如果客户端断开连接,我想取消/停止这些任务(在 GET 请求的情况下,而不是例如 POST 文件上传)。似乎情况并非如此,并且任务继续运行到 完成。

也许我可以使用 ServletRequestListener.requestDestoryed 侦听器来获取此类任务的通知,但是推荐什么 停止请求线程的方法?释放数据库连接、文件句柄或正在运行的任务等资源怎么样? (执行人服务)?

尽快停止此类任务的推荐方法是什么?

【问题讨论】:

    标签: java servlets jetty


    【解决方案1】:

    首先我建议更新到最新版本的码头,自 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 容器之外进行测试。

    至少 imo :)

    【讨论】:

    • 这并不能真正处理用户中止“长”请求的情况。事实上,知道什么时候中止异步请求比较棘手,因为它需要更多的工作来检测客户端是否永远消失了。主要问题之一是如果容器检测到客户端已关闭底层套接字,容器是否会在 servlet 从其service() 方法返回之前触发requestDestroyed() 事件。我猜它不会,因为这真的会搞砸一个 servlet。
    • 当然,但是没有与 servlet api 签订的合同让客户端表明它不再像您正在寻找的那样感兴趣,也许您想要的是使用延续或异步 servlet 的 ajax 类型模型客户需要每 30 秒保持一次心跳或其他什么...检查 cometd 以获取类似的东西,这是个好东西
    • 是的,我认为基于 Comet 的解决方案是最好的选择。
    • 我知道可以通过其他方式减轻临时资源的使用,包括延续和执行者。我试图将问题归结为真正的问题,那就是 servlet 模型和码头 api 似乎不允许检测客户端断开连接和终止当前处理。也不知道使用 HTTP1.1 通过同一个套接字发出多个请求的浏览器如何与 servlet 模型交互?或者,即使我无法防止资源浪费,我至少可以通过专门用于处理此类请求的线程池来限制此类请求的资源使用..
    猜你喜欢
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    • 2013-12-13
    相关资源
    最近更新 更多