【问题标题】:Tomcat: is NIO used although not being configured?Tomcat:虽然没有配置,但是否使用了 NIO?
【发布时间】:2015-05-17 11:15:09
【问题描述】:

根据下面的文章:http://java.dzone.com/articles/understanding-tomcat-nio,了解Tomcat实例是否使用NIO(而不是BIO)的方法是寻找:

INFO: Initializing ProtocolHandler ["http-nio-8080"]

在我的 Tomcat 服务器上,我有:

grep "Initializing ProtocolHandler" /opt/tomcat/logs/*
/opt/tomcat/logs/catalina.2015-02-23.log:23-Feb-2015 15:20:00.627 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"]
/opt/tomcat/logs/catalina.2015-02-23.log:23-Feb-2015 15:20:00.665 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["ajp-nio-8009"]

但是我的 server.xml 不包含任何告诉它使用 NIO 的内容,我的连接器如下所示:

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

换句话说,我没有像上面的文章那样将协议设置为使用 org.apache.coyote.http11.Http11NioProtocol。

为什么服务器似乎仍在使用 NIO?

-- 附加信息

  • Tomcat 版本:8.0.15.0
  • JVM 版本:1.8.0_25-b17
  • 正在使用 Spring MVC。

提前谢谢

【问题讨论】:

    标签: tomcat


    【解决方案1】:

    但是我的 server.xml 确实包含任何告诉它使用 NIO 的内容,

    NIO 是 Tomcat 8 的默认 HTTP 和 AJP 连接器实现。

    默认的 HTTP 和 AJP 连接器实现已从 Java 阻塞 IO 实现 (BIO) 到 Java 非阻塞 IO 实施(NIO)。 BIO 仍然可以使用,但 Servlet 3.1 和 使用非阻塞 IO 的 WebSocket 1.0 特性将使用阻塞 IO 而不是这可能会导致意外的应用程序行为。

    http://tomcat.apache.org/migration-8.html#Default_connector_implementation

    【讨论】:

    • 谢谢。如何?它只是忽略 server.xml 中设置的协议属性吗?那么如何切换到 BIO 呢?它是否记录在某处?
    • protocol属性只定义了Http或者AJP而不是实现NIO或者BIO的类
    • 但根据tomcat.apache.org/tomcat-8.0-doc/config/http.html,它明确表示可以设置一个类。它还说如果未设置,如果使用 LD_LIBRARY_PATH,它将使用 BIO 或 APR。因为在我的情况下我没有设置 LD_LIBRARY_PATH,我会假设它会使用 BIO,是什么告诉 Tomcat 使用 NIO?
    • APR -as-not-required-to-run-tomcat 是使用 NIO 连接器的一种方式,但 Tomcat8 仍然默认使用 NIO,无需安装 APR。
    • 很抱歉坚持,但是您是否有指向文档或源代码的指针来证明它使用 NIO,因为您所说的目前与上面链接的文档相矛盾。谢谢
    猜你喜欢
    • 1970-01-01
    • 2011-02-11
    • 2013-03-13
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多