【问题标题】:How to limit the request execution time with Tomcat 6如何使用 Tomcat 6 限制请求执行时间
【发布时间】:2013-01-28 09:00:51
【问题描述】:

我正在使用 Spring 和 Tomcat 6 开发 Web 应用程序。有时,由于某种原因,请求需要很长时间才能完成,并且会降低服务器的性能。是否可以限制 Tomcat 6 或 Spring 中的请求执行时间?欢迎使用其他有关此问题的方法。谢谢。

【问题讨论】:

  • 请求是否需要很长时间来处理数据或从数据库中获取数据?在此基础上,我可以提出解决方案。
  • @Vivek:长请求主要是处理数据。我们可以将它们放入队列并按顺序处理,但很难确定哪些请求符合条件。
  • 为什么长请求会“降低服务器的性能”。即使您使用下面 TechExchange 的答案,如果是队列中的作业使您的服务器变慢,并且一个长时间运行的请求进入并被添加到队列中,那么仅仅超时连接不会修复您的性能问题;该作业仍将在队列中,并且可能会被处理。
  • @Disco3 有了队列,我们​​可以立即响应并稍后处理作业,并且可以安排它们以便不会同时处理长作业。

标签: java spring tomcat6


【解决方案1】:

使用HttpConnector配置connectionTimeout

修改你的 server.xml

<Connector ... connectionTimeout="xxxx"

其中 xxxx 是毫秒数

【讨论】:

  • 据我所知,这是答案
  • 根据文档,connectionTimeout 是“此连接器在接受连接后等待显示请求 URI 行的毫秒数”。就我而言,请求已完全收到。
【解决方案2】:

Tomcat 6 或 Spring 是否可以限制请求执行时间?

是的,这是可能的,但您需要自己实现。

基本思路是请求方法需要使用一个Timer为自己安排一个未来N秒的中断。然后它需要在请求处理过程中定期检查是否被中断。最后,如果在超时之前完成,它需要取消定时器。


以上假设是 servlet 应该限制它花费在处理请求上的时间。相反,如果你想在客户端实现超时,很容易在请求完成时设置超时;例如见Tomcat request timeout。

(但是客户端超时的问题是服务器不会知道客户端已经放弃等待,并且无论如何都会继续处理请求。这很容易陷入大问题。想象一下完成时间比超时时间长得多的请求,再加上客户端反复重试已超时的请求...)

【讨论】:

    【解决方案3】:

    Sthepen 的上述说法是不正确的。在客户端,当它放弃或浏览器关闭时,浏览器当然不会保持其套接字活动。它会关闭套接字(恢复内存和端口,对吗?)。关闭程序将发送确定的信号到服务器端套接字 - 我相信是 RST。

    【讨论】:

      猜你喜欢
      • 2020-02-04
      • 2011-02-26
      • 2012-11-14
      • 2011-08-29
      • 1970-01-01
      • 1970-01-01
      • 2018-04-23
      • 1970-01-01
      相关资源
      最近更新 更多