JBoss 在没有更多线程可用时阻止 keep-alive
JBoss preventing keep-alive when no more thread available
在使用我的 JBoss 5.1 服务器进行试验后,我注意到如果当前线程是最后一个可用线程,HTTP 响应包含 Connection: close
header。
例如,如果我在 the HTTP connector config 中设置 maxThreads="4"
并执行超过 4 个模拟请求,则:
- 3个第一个响应不包含任何
Connection
header(意味着连接可以是reused by the client for future requests)
- 所有下一个请求都包含
Connection: close
header(这意味着客户端必须为下一个请求在不同的端口上创建一个新连接)
我找不到任何相关文档。这种行为在某处解释了吗?是否有可能避免它(即防止此 Connection: close
header)以便客户端可以为将来的请求重用套接字?
我快速浏览了 Tomcat code(JbossWeb,Jboss 的 Web 容器基于此)。
如果允许连接保持活动状态,Http11Processor 不会从处理方法中显示 return。因此保持活动连接在连接打开时使用 HTTP 池的线程。
为了防止池被非活动的保持活动连接清空,线程池很可能(我在 PooledSender 中发现了可能执行此操作的代码的某些部分)禁用了可能性在开始处理新请求之前,为池中的最后一个线程保持连接打开。否则,通过创建有限数量的保持活动连接来阻止 Tomcat/Jboss 太容易了。
在使用我的 JBoss 5.1 服务器进行试验后,我注意到如果当前线程是最后一个可用线程,HTTP 响应包含 Connection: close
header。
例如,如果我在 the HTTP connector config 中设置 maxThreads="4"
并执行超过 4 个模拟请求,则:
- 3个第一个响应不包含任何
Connection
header(意味着连接可以是reused by the client for future requests) - 所有下一个请求都包含
Connection: close
header(这意味着客户端必须为下一个请求在不同的端口上创建一个新连接)
我找不到任何相关文档。这种行为在某处解释了吗?是否有可能避免它(即防止此 Connection: close
header)以便客户端可以为将来的请求重用套接字?
我快速浏览了 Tomcat code(JbossWeb,Jboss 的 Web 容器基于此)。
如果允许连接保持活动状态,Http11Processor 不会从处理方法中显示 return。因此保持活动连接在连接打开时使用 HTTP 池的线程。
为了防止池被非活动的保持活动连接清空,线程池很可能(我在 PooledSender 中发现了可能执行此操作的代码的某些部分)禁用了可能性在开始处理新请求之前,为池中的最后一个线程保持连接打开。否则,通过创建有限数量的保持活动连接来阻止 Tomcat/Jboss 太容易了。