我的理解是,在 Tomcat 中,每个请求将占用一个 Java/(以及操作系统)线程。
想象一下,我有一个包含大量长时间运行请求的应用程序(例如,有多个玩家的扑克游戏),其中涉及游戏内聊天和 AJAX 长轮询等。
有没有办法更改我的 webapp 的 tomcat 配置/架构,这样我就不会为每个请求使用线程,而是“拦截”请求和响应,以便可以将它们作为队列的一部分进行处理?
我的理解是,在 Tomcat 中,每个请求将占用一个 Java/(以及操作系统)线程。
想象一下,我有一个包含大量长时间运行请求的应用程序(例如,有多个玩家的扑克游戏),其中涉及游戏内聊天和 AJAX 长轮询等。
有没有办法更改我的 webapp 的 tomcat 配置/架构,这样我就不会为每个请求使用线程,而是“拦截”请求和响应,以便可以将它们作为队列的一部分进行处理?
我认为您对tomcat喜欢在自己的线程中处理每个请求是正确的。这对于多个并发线程可能是有问题的。我有以下建议:
在 server.xml 中配置 Connector 元素的 maxThreads 和 acceptCount 属性。通过这种方式,您可以将可以产生的线程数限制在阈值内。一旦达到该限制,请求就会排队。acceptCount 属性就是设置这个队列的大小。最简单的实施,但不是一个好的长期解决方案
在 server.xml 中配置多个 Connector 元素,并通过在 server.xml 中添加 Executor 元素使它们共享一个线程池。您可能希望将 tomcat 指向您自己的 Executor 接口实现。
如果您想要更精细的控制而不是如何处理请求,请考虑实现您自己的连接器。server.xml 中连接器元素的“协议”属性应指向您的新连接器。我这样做是为了添加一个自定义 SSL 连接器,效果很好。
您是否会将这个问题简化为使 tomcat 在请求/连接数量方面更具可扩展性的一般要求?通用的解决方案是配置一个负载均衡器来处理多个 tomcat 实例。