java - Tomcat 连接器如何工作?

标签 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 之间没有行为差异,只是实现不同,这是真的吗?

Tomcat 8 使用默认协议(protocol)设置的连接器 protocol="HTTP/1.1"什么时候没有可用的 APR/native 连接器?

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

我做了一个像这样的小 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 个连接都被接受。

最佳答案

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

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

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

这里很好summary/comparison

关于java - Tomcat 连接器如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36061897/

相关文章:

java - 安卓工作室 - 设置背景()

java - 如何在Java Canvas 中添加这个按钮?

html - 如何使用 jdbc、servlets 和 html 将文件远程上传到 MySQL 数据库

Java 序列化异常消息

java - 文件上传在 spring mvc 和 tomcat6 中不起作用

java - Spring MVC 4与mvc :resources not working

tomcat - CVE-2016-8735 : Apache Tomcat Remote Code Execution

java - 为什么我无法初始化通用参数和数组?

mysql - Elastic Beanstalk hibernate MySQL

java - java Canvas 上耗时