在我的网络应用程序中,有一些请求的持续时间超过20秒。但在某些情况下,代码可能导致无限循环或类似的东西,从而减慢服务器的速度。
我想在服务器端发出60秒的请求超时。这是在tomcat中实现的吗?
谢谢你, 霍拉丘
答案 0 :(得分:42)
使用Tomcat 7,您可以添加StuckThreadDetectionValve,这将使您能够识别“卡住”的线程。您可以在要进行检测的应用程序的Context元素中设置阀门:
<Context ...>
...
<Valve
className="org.apache.catalina.valves.StuckThreadDetectionValve"
threshold="60" />
...
</Context>
这将在tomcat日志中为任何花费超过60秒的线程写入一个WARN条目,这将使您能够识别应用程序并禁止它们,因为它们有问题。
基于source code,您可以编写自己的阀门来尝试停止线程,但是这会对线程池产生影响,并且no reliable way会停止线程在Java中没有该线程的合作......
答案 1 :(得分:21)
如果您试图阻止请求运行太长时间,那么在Tomcat中设置超时对您没有帮助。正如Chris所说,您可以为Tomcat设置全局超时值。但是,从The Apache Tomcat Connector - Generic HowTo Timeouts开始,请参阅回复超时部分:
JK还可以在请求回复时使用超时。此超时不会 测量响应的完整处理时间。相反,它控制, 允许连续响应数据包之间的时间。
在大多数情况下,这是人们真正想要的。例如,考虑一下 长时间运行下载。你将无法设置有效 全局回复超时,因为下载可能会持续很长时间。 大多数应用程序在开始之前的处理时间有限 返回响应。对于那些应用程序,您可以设置 显式回复超时。与回复不协调的应用程序 超时是批量类型应用程序,数据仓库和报告 预计会有很长的处理时间的应用程序。
如果JK中止等待响应,因为触发了回复超时, 没有办法停止后端处理。虽然你有空 处理您的Web服务器中的资源,请求将继续 在后端运行 - 没有任何方法一旦发送回结果 回复超时已解雇。
因此,Tomcat将检测到servlet在超时内没有响应并将向用户发回响应,但不会停止线程运行。我认为你无法实现你想做的事。
答案 2 :(得分:9)
您可以在server.xml中设置默认超时
<Connector URIEncoding="UTF-8"
acceptCount="100"
connectionTimeout="20000"
disableUploadTimeout="true"
enableLookups="false"
maxHttpHeaderSize="8192"
maxSpareThreads="75"
maxThreads="150"
minSpareThreads="25"
port="7777"
redirectPort="8443"/>
答案 3 :(得分:1)
本文讨论在服务器级别设置超时。 http://www.coderanch.com/t/364207/Servlets/java/Servlet-Timeout-two-ways
是什么导致应用程序进入无限循环?如果要打开与其他资源的连接,则可能需要在这些连接上设置超时,并在发生超时时发送适当的响应。
答案 4 :(得分:0)
对于那些不喜欢上面发布的解决方案的人,我可以自己实现一个计时器,并通过抛出运行时异常来停止执行请求。如下所示:
try
{
timer.schedule(new TimerTask() {
@Override
public void run() {
timer.cancel();
}
}, /* specify time of the requst */ 1000);
}
catch(Exception e)
{
throw new RuntimeException("the request is taking longer than usual");
}
或者最好使用java guava timeLimiter here
答案 5 :(得分:-7)
在Eclipse中添加tomcat
在Eclipse中,作为tomcat服务器,双击“Tomcat v7.0 Server at Localhost”,将超时设置45中显示的属性更改为您喜欢的任何一个区域