在spring 3.0应用程序中设置最大响应时间

时间:2011-03-10 20:03:42

标签: apache spring tomcat spring-mvc

我有一个网络应用程序,我们的产品所有者声明必须在2.5秒内响应并在3秒内可用。

现在,它主要是在一个切成薄片的Spring MVC层之上的POJO,它用于依赖注入并将请求定向到控制器。

webapp是一堆非常薄的肉片,它们被构建用于为不同的非常古老的不规则API提供凝聚力。其中一些可能需要超过3秒(虽然不常见)

我想要的是一种告诉spring或tomcat的方法,如果它没有在2500ms内加载JSP我想加载jsp告诉我们的用户“Dude,我们在这里通过糖蜜爬行!”给我们一秒钟再试一次。如果你多次得到这个页面,那么你真的很棒!“

现在看起来我可以通过几种方式做到这一点(按照我的愿望排序)

  • 在春天,我可以设置超时并加载不同的jsp
  • 在负载均衡器中,我可以使用重定向设置超时
  • 在tomcat中我可以设置超时并加载不同的jsp
  • 在apache中,我可以设置一个重定向的tomcat
  • 在应用程序中我将体系结构拆分为在每100毫秒轮询一次的线程中运行,以查看它是否已停止运行,并在2500ms后抛出异常

1 个答案:

答案 0 :(得分:0)

如果我没记错的话,所有对Spring MVC的请求都是通过一个过滤器进行的。您可以覆盖它并编写超时设置(例如,具有可配置的XML,其中包含超时强制的URL或路径)。 Guava的TimeLimiter将是实现超时实施的好工具。

<general-rant>

我不知道你所在的行业,但一般来说,在网络世界中,如果一个回复没有在2-3s内回复,那么恐慌是有点过于自我要求,特别是如果长时间回应是只是少数(如你所说)。我有大堆(Xmx = 10g)的经验,只需一个GC可以花费几个分钟来完成。好吧,也许这是一个被高估的例子,但是一两秒钟服用GC是非常合理的。

即使Tomcat manual非常小的超时可能会适得其反。您的产品所有者必须胆怯:)

</general-rant>

啊,还有更多。不要忘记,如果您已经将某些内容发布回servlet响应,则不能只重定向。因此,您可能需要延迟响应,直到最后一点计算完成并在最后刷新所有内容。这意味着您必须使用装饰器包装HttpServletResponse,该装饰器具有某种锁存器,该锁存器会延迟响应输出直到生成完整响应,或者如果发生超时 - 重定向到“ouch”页面。