有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

基于每个上下文的java Tomcat max连接

我有多个web应用程序在一个Tomcat容器下运行。由于它们都在一个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. 在服务器中创建一个单独的Tomcat连接器。每个上下文的xml文件。这有几个问题。首先,每个连接器都需要一个单独的端口;这意味着我必须在我的apache配置中说明这一点。其次,我计划定期添加更多网络应用;这意味着配置更改之后会重启tomcat,这会中断客户端

还有人遇到过这样的事情吗?我觉得应该有一个“Tomcat支持的”工作流程来完成我想要的


共 (1) 个答案

  1. # 1 楼答案

    我将发布一个Tomcat用户组提供给我的答案:http://tomcat.apache.org/tomcat-9.0-doc/config/valve.html#Semaphore_Valve(信号量阀不是Tomcat 9特有的,但实际上是在Tomcat 6中引入的)。我尝试了这个概念,发现了以下实际应用:

    1. (未测试)信号量阀应该能够嵌套在服务器的主机元素中。xml文件
    2. (测试)一个[上下文名称]。xml文件可以放在[tomcat-home]/conf/Catalina/localhost中,阀门嵌套在上下文元素中

    这不一定是我要采用的解决方案,因为需要进行更多的测试。然而,我想我应该补充这一点,因为这是这个问题的一个潜在答案

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

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

    感谢Apache集团的Mark Thomas提供解决方案