我的 Tomcat 6.0.26 有时死机时说:
SEVERE:所有线程 (150) 当前都处于忙碌状态,正在等待。增加 maxThreads (150) 或检查 servlet 状态
...然后 Tomcat 关闭,用户无法访问 Web 应用程序,直到我手动重新启动 Tomcat。
有些线程确实需要很长时间才能执行,这是设计使然,而不是线程失控的问题。
我知道我可以增加 maxThreads,但这不是一个可行的解决方案,因为服务器可能会收到更多请求。
问题:我可以告诉 Tomcat 在达到maxThreads并且AJP/1.3 积压已满时只丢弃请求,而不是死掉吗?
server.xml
无论如何,以下是我的:
<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JasperListener" />
<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina">
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" minSpareThreads="100"/>
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"
enableLookups="false" useBodyEncodingForURI="true"
backlog="150" maxThreads="150" executor="tomcatThreadPool"
keepAliveTimeout="5000" connectionTimeout="300000" />
<Engine name="Catalina" defaultHost="localhost" jvmRoute="ecm1">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
</Host>
</Engine>
</Service>
</Server>
Tomcat 不会因为线程已满而崩溃。它将请求排队到acceptCount中设置的限制,然后在达到最大值时拒绝请求。