我有多个Web应用程序在单个Tomcat容器下运行.由于它们都在单个Tomcat连接器下运行(如server.xml文件中所定义),因此maxConnections和maxThreads等属性将整个容器控制在容器中.因此,单个应用程序可能会占用所有可用的Tomcat线程,使线程的其他应用程序匮乏并使它们无响应.我希望能够在每个上下文的基础上定义最大的http线程,以便不再可能.
这是我到目前为止所尝试的:
>在应用程序中创建自定义筛选器,以跟踪当前线程数并限制其他连接. (在这里得到了过滤器:How to set limit to the number of concurrent request in servlet?).我不确定我喜欢这个解决方案,因为它不是全功能(支持诸如acceptCount,maxConnections,maxThreads和minSpareThreads之类的属性),因为Tomcat默认提供给容器;并添加功能感觉就像我正在尝试构建Tomcat中已存在的内容.
>在server.xml文件中为每个上下文创建单独的Tomcat连接器.这有一些问题.例如,每个连接器需要一个单独的端口;这意味着我必须在我的apache配置中考虑到这一点.其次,我计划定期添加更多的webapps;这意味着配置更改后再进行tomcat重启,这会对客户端造成干扰.
还有其他人遇到过这样的事吗?我觉得应该有一个“Tomcat支持”工作流来完成我所追求的目标.
最佳答案 我将发布一个从Tomcat用户组提供给我的答案:
http://tomcat.apache.org/tomcat-9.0-doc/config/valve.html#Semaphore_Valve(Semaphore Valve不是特定于Tomcat 9,但实际上是在Tomcat 6中引入的).我试验了这个概念,并找到了以下实际应用:
>(未经测试)Semaphore Valve应该能够嵌套在server.xml文件的Host元素中.
>(已测试)[context-name] .xml文件可以放在[tomcat-home] / conf / Catalina / localhost中,并且阀门嵌套在Context元素中.
这不一定是我要使用的解决方案,因为需要执行更多测试.但是,我想我会添加它,因为它是解决问题的潜在答案.
更新:
作为回顾,SemaphoreValve是我通过Tomcat用户邮件列表推荐给我的一个选项,作为我上面描述的问题的解决方案.事实证明它比我预期的更容易实现.将以下内容添加到Tomcat / conf目录中的context.xml中可以解决这个问题:
< Valve className =“org.apache.catalina.valves.SemaphoreValve”concurrency =“10”fairness =“true”/>
感谢Apache集团的Mark Thomas提供解决方案.