Tomcat连接器如何工作?

时间:2016-03-17 13:25:06

标签: java tomcat tomcat8 connector

假设您使用(阻塞)BIO连接器,如下所示:

<Connector port="8080" protocol="org.apache.coyote.http11.Http11Protocol" connectionTimeout="20000" redirectPort="8443" maxConnections="1000" maxThreads="200" />

你做了201个并发连接,最后一次连接会发生什么?

如果您进行1001个并发连接,那么最后一次连接会发生什么?

接下来让我们使用(非阻塞)NIO连接器protocol="org.apache.coyote.http11.Http11NioProtocol"

如果我们建立201和1001并发连接会有什么不同吗?

据我所知,NIO和NIO2之间没有行为差异,只有实现不同,这是真的吗?

当没有可用的APR /本机连接器时,Tomcat 8使用哪种连接器与默认协议设置protocol="HTTP/1.1"

-------------编辑---------------

我做了一个像这样的小servlet:

Thread.sleep(2000);
response.getWriter().write("ok");

设置这些设置connectionTimeout="20000" maxConnections="10" maxThreads="2"并发出50个并发请求。所有都将被接受,然后一次执行2(执行线程完成时)。即使connectionTimeout="20000"maxConnections="10",也没有超出请求超时或出错。

protocol="org.apache.coyote.http11.Http11NioProtocol"protocol="org.apache.coyote.http11.Http11Protocol"完全相同。我想差异显示你有Keep-Alive个连接。 BIO会在整个连接期间阻塞一个线程,NIO会在每次请求后释放线程。

当我测试相同的场景但添加参数acceptCount="15"时,Dennis R指出,只有大多数请求返回org.apache.http.conn.HttpHostConnectException: Connection to http://localhost:8080 refused

---------- edit2 -----------

请注意,如果我设置此maxConnections="100" acceptCount="15",则会接受所有50个连接。

1 个答案:

答案 0 :(得分:3)

以下是配置参数:Apache Tomcat 8 Configuration Reference 基本上是Executor,标准实现中的队列默认长度是: acceptCount = 100

最大连接数是指总共接受的连接数(在队列中和正在处理中)。 连接被拒绝,我假设基于先到达的内容。

NIO不受请求处理器线程的限制。

这是好summary/comparison