Tomcat 如果新的servlet请求在旧的servlet请求完成之前到达,如何取消servlet请求

Tomcat 如果新的servlet请求在旧的servlet请求完成之前到达,如何取消servlet请求,tomcat,servlets,Tomcat,Servlets,我有一个JavaScript应用程序,它允许用户向我的Tomcat服务器发出多个重叠的只读请求,这样以后的请求就会取消并覆盖任何以前的请求。我可以禁用所有客户端控件,直到收到请求,但我更愿意让它们处于启用状态,让用户随时单击,并取消以前的请求 我想做的是取消除最新请求之外的所有请求,这样我的服务器就不会浪费时间来完成那些永远看不到的请求。我希望服务器中止为该请求运行的线程,以减少服务器资源 最好的方法是什么?我认为您可以在服务器上执行此操作,但正如评论中所暗示的那样,这有点不切实际 您需要一个数

我有一个JavaScript应用程序,它允许用户向我的Tomcat服务器发出多个重叠的只读请求,这样以后的请求就会取消并覆盖任何以前的请求。我可以禁用所有客户端控件,直到收到请求,但我更愿意让它们处于启用状态,让用户随时单击,并取消以前的请求

我想做的是取消除最新请求之外的所有请求,这样我的服务器就不会浪费时间来完成那些永远看不到的请求。我希望服务器中止为该请求运行的线程,以减少服务器资源


最好的方法是什么?

我认为您可以在服务器上执行此操作,但正如评论中所暗示的那样,这有点不切实际

您需要一个数据结构(可能是一个HashMap)来跟踪

  • 发出请求的用户
  • 为请求提供服务的当前对象
  • 任何其他有助于识别请求的上下文内容
对于servlet的传入HTTP请求,请查阅查找表,并确定是否已经存储了线程对象。如果是这样,那么,继续在当前线程中执行。在线程将内容返回给客户端之前,请确保从HashMap中删除线程的条目


这是一个相当复杂的情况。任何时候处理并发,都有可能把事情搞砸。如果您真的非常想节省服务器端资源,我只会遵循这条路线。否则,正如建议的那样,仅仅使用AJAX取消客户端的上一个调用可能会容易得多。

如果只是为了节省服务器CPU时间,那么客户端取消请求对您没有帮助。简单的方法是:忽略它,接受请求仍将计算,直到服务器端请求处理器意识到其输出流已关闭并将失败

如果您有一些确实需要很长时间才能完成的繁重操作,我会选择分块执行服务器端工作,并检查请求是否仍然需要继续。任何新请求都可以设置同一用户的其他线程正在检查的标志

在java线程级别(例如thread.stop等)进行交互不是在应用程序逻辑中进行交互的好方法。但是,如果您有一些应用程序逻辑来确定哪些用户需要完成哪些操作,并且每个操作都可以检查是否仍然需要,这可能会对您有所帮助。你仍然会浪费一些周期,但不一定是全部


此外,如果您在java线程级别上进行交互,请记住,线程很可能由应用程序服务器拥有,并在线程池中用于请求处理-因此您不应该(从外部)干扰它们。

您不能在服务器上执行此操作,而应该在客户端执行此操作。如果上一个调用尚未完成,则在启动新调用时使用AJAX并取消上一个调用。看@AleksG谢谢你的快速反应!很好的链接。正如您所说,您不能在服务器上执行此操作。但我不太容易接受“不能”。