基于每个上下文的Tomcat最大连接数

时间:2016-10-14 18:43:25

标签: java tomcat servlets

我在一个Tomcat容器下运行多个Web应用程序。由于它们都在单个Tomcat连接器下运行(如server.xml文件中所定义),因此maxConnections和maxThreads等属性将整个容器控制在容器中。因此,单个应用程序可能会占用所有可用的Tomcat线程,使线程的其他应用程序匮乏并使它们无响应。我希望能够在每个上下文的基础上定义最大的http线程,这样就不再可能了。

这是我迄今为止所做的尝试:

  1. 在应用程序中创建一个自定义过滤器,用于跟踪当前线程数并限制其他连接。 (在这里得到了过滤器:How to set limit to the number of concurrent request in servlet?)。我不确定我喜欢这个解决方案,因为它不像Tomcat默认提供给容器那样功能齐全(支持诸如acceptCount,maxConnections,maxThreads和minSpareThreads之类的属性);并且添加功能感觉就像我正在尝试构建Tomcat中已存在的内容。
  2. 在server.xml文件中为每个上下文创建单独的Tomcat连接器。这有一些问题。例如,每个连接器需要一个单独的端口;这意味着我必须在我的apache配置中考虑到这一点。其次,我计划定期添加更多的webapps;这意味着配置更改后跟tomcat重启,这对客户端造成破坏。
  3. 还有其他人遇到过这样的事吗?我觉得应该有#34; Tomcat支持"完成我之后的工作流程。

1 个答案:

答案 0 :(得分:1)

我将发布从Tomcat用户组提供给我的答案:http://tomcat.apache.org/tomcat-9.0-doc/config/valve.html#Semaphore_Valve(Semaphore Valve不是特定于Tomcat 9,但实际上是在Tomcat 6中引入的)。我试验了这个概念,并找到了以下实际应用:

  1. (未经测试)Semaphore Valve应该能够嵌套在server.xml文件的Host元素中。
  2. (已测试)[context-name] .xml文件可以放在[tomcat-home] / conf / Catalina / localhost中,并且阀门嵌套在Context元素中。
  3. 这不一定是我要使用的解决方案,因为需要执行更多测试。但是,我认为我添加了这个,因为它是解决问题的潜在答案。

    更新
    作为回顾,SemaphoreValve是我通过Tomcat用户邮件列表推荐给我的一个选项,作为我上面描述的问题的解决方案。事实证明它比我预期的更容易实现。将以下内容添加到Tomcat / conf目录中的context.xml可以解决问题:

    <Valve className="org.apache.catalina.valves.SemaphoreValve" concurrency="10" fairness="true" />

    感谢Apache小组的Mark Thomas提供解决方案。