【发布时间】:2016-10-14 18:43:25
【问题描述】:
我有多个 Web 应用程序在单个 Tomcat 容器下运行。由于它们都在单个 Tomcat 连接器(如 server.xml 文件中定义)下运行,因此 maxConnections 和 maxThreads 等属性将容器作为一个整体来管理。因此,单个应用程序可能会消耗所有可用的 Tomcat 线程,从而使其他应用程序的线程匮乏并使其无响应。我希望能够在每个上下文的基础上定义最大 http 线程,这样就不再可能了。
这是我迄今为止尝试过的:
- 在应用程序中创建一个自定义过滤器,以跟踪当前线程数并限制其他连接。 (这里有过滤器:How to set limit to the number of concurrent request in servlet?)。我不确定我是否喜欢这个解决方案,因为它不像 Tomcat 默认为容器提供的那样全功能(支持诸如 acceptCount、maxConnections、maxThreads 和 minSpareThreads 等属性);添加功能感觉就像我在尝试构建 Tomcat 中已经存在的东西。
- 在 server.xml 文件中为每个上下文创建一个单独的 Tomcat 连接器。这有几个问题。一方面,每个连接器都需要一个单独的端口;这意味着我必须在我的 apache 配置中考虑到这一点。其次,我计划定期添加更多的 webapp;这意味着配置更改后会重新启动 tomcat,这会对客户端造成干扰。
有没有其他人遇到过这样的事情?我觉得应该有一个“支持 Tomcat”的工作流程来完成我所追求的。
【问题讨论】:
-
我会说你做到了。这就是为什么使用一个应用程序服务器来管理一组应用程序已经过时的一个原因。除了为每个应用程序定义一个自己的连接器之外,没有其他解决方案。
-
@PaulWasilewski 你有什么更现代的方法的细节吗?每个应用一个 Tomcat 实例?
-
@Staros,是的,这将是一种方法。但这将很难管理。您应该使用 Spring Boot、Dropwizard 或 Play 等框架来摆脱外部应用服务器实例,让服务器成为代码的一部分。看看jaxenter.com/java-application-servers-dead-1-111928.html
-
@PaulWasilewski 感谢您的反馈。我按照本教程证明了在没有您列出的框架的帮助下将 Tomcat 嵌入到您的应用程序中并不难(因为迁移会非常痛苦):oracle.com/webfolder/technetwork/tutorials/obe/java/…。
-
@BryanLarson,我对您的应用程序了解不多,并且肯定有比我提到的框架更多的方法。