告诉 Tomcat 放弃请求而不是死亡“所有线程(150)当前正忙”

告诉 Tomcat 放弃请求而不是死亡“所有线程(150)当前正忙”

我的 Tomcat 6.0.26 有时会死机,提示:

严重:所有线程(150)当前正忙,正在等待。增加 maxThreads(150)或检查 servlet 状态

...然后 Tomcat 关闭,并且用户无法访问 web 应用程序,直到我手动重新启动 Tomcat。

有些线程确实需要很长时间才能执行,这是设计使然,而不是线程失控的问题。

我知道我可以增加 maxThreads,但这不是一个可行的解决方案,因为服务器可能会收到更多的请求。

问题:我可以告诉 Tomcat 在以下情况下放弃请求吗?最大线程数已达到并且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>

答案1

Tomcat 不会因为线程数达到上限而崩溃。它会将请求排队到接受计数如果达到最大值,则拒绝请求。

相关内容