说起Tomcat的NIO,不得不提的就是Connector这个Tomcat组件。...想了解Tomcat NIO的工作方式,就得先了解一下Connector的实现原理。...Tomcat NIO Tomcat在处理客户端请求时,读写socket数据是一种网络IO操作。目前Tomcat有几种IO方式,分别是BIO(同步阻塞),NIO(同步非阻塞)和AIO(异步非阻塞)。...这里主要看NIO。 Tomcat NIO模型 当然要了解一下Tomcat NIO的模型了。Tomcat NIO是基于Java NIO实现的,其基本原理如下: ?...这里就不在赘述,以后有时间专门写一篇Tomcat容器的工作原理。 参考文章: 《Tomcat内核设计剖析》 深度解读Tomcat中的NIO模型
} catch (IOException ioe) { log.error(sm.getString("endpoint.nio.selectorCloseFail
在上一篇文章里我们主要介绍了 tomcat NIO 中响应数据的写入,在这里我们主要介绍 BlockPoller 线程。...tomcat NIO 架构中会有一个 BlockPoller 线程,该线程主要处理阻塞的读写操作。...(一般为tomcat io线程)。...BlockPoller 实例都有一个 NIO selector 对象,主要用于监测注册在原始 scoket 上的事件是否发生。...目前先写到这里,下一篇文章里我们继续介绍 tomcat NIO 中的 block poller 线程的阻塞与唤醒。
在上一篇文章里我们主要介绍了 tomcat NIO 中的 acceptor 线程,其中包括了server 监听 socket 的初始化,端口绑定,acceptor 线程的启动,接受连接请求,将请求事件注册到...tomcat NIO 架构中会有 poller 线程,每一个 poller 实例都有一个 NIO selector对象,主要用于监测注册在原始 scoket 上的事件是否发生。...在tomcat 8 及以前的版本中,可以通过 pollerThreadCount 配置 poller thread 的数目。...也就是说把SocketWrapper 对象实例委托给 SocketProcessor实例的 run() 方法,在 tomcat io 线程池中运行。...目前先写到这里,下一篇文章里我们继续介绍 tomcat NIO 中 poller 线程的阻塞与唤醒。
Tomcat 服务器(tomcat7以上)默认使用 java NIO 模型,NIO 不仅仅需要 java 语言上的支持,同时还离不开各种操作系统对于多路复用的支持(linux,windows,mac等等...对于异步 IO 是 tomcat AIO 的实现,不在这里介绍,不过目前基本都是使用tomcat NIO ,几乎很少选择使用 AIO 。...在语言层面,tomcat 实现了一系列 java class 来对 NIO 进行支持,同时也有自己的一套 NIO 模型来配合相关的 class 来运转。...另外也对异步 servlet 和长连接有所支持,所以本系列文章中包含如下知识点的介绍: NIO 基础之多路复用 Tomcat IO 关键类 Tomcat NIO 模型 Acceptor 线程 Poller...线程 Tomcat IO 线程读写数据 Block Poller 线程 Tomcat 长连接 Tomcat 异步支持 目前先写到这里,下一篇文章里我们继续介绍 NIO 基础之多路复用。
在上一篇文章里我们主要介绍了 tomcat NIO 的整体架构,以及在这个架构下的各个线程,在这里我们主要介绍 acceptor 线程。...在tomcat NIO 中会有一个独立的 acceptor 线程,主要负责接监听端口,接受连接请求,并将请求事件注册到 poller 线程中,主要包括如下: 初始化 server socket,并绑定监听端口...在上述的 if 分支里, 会利用 java NIO 对象 ServerSocketChannel 创建 server socket ,绑定监听地址和端口,设置 socket 的 backlog 以及其他属性...目前先写到这里,下一篇文章里我们继续介绍 tomcat NIO 中的 poller 线程。
在上一篇文章中我们主要介绍了 tomcat nio 中的长连接,包括长连接开启和关闭的条件,每个长连接可以复用的请求数目等等,在这里我们介绍 tomcat 对文件上传的支持。...文件上传的本质 对于 tomcat 上传文件来说,其本质是把文件上传到 tomcat 工作目录中,通过getPart() 等 API 得到的 inputstream 已经是上传在工作目录中磁盘中文件的输入流了...工作目录中的 Tomcat/{FQDN}/{Context} 。...文件上传的本质是把文件写到 tomcat 工作目录的磁盘中,由 getPart() 相关 API 得到磁盘中文件的大小,文件名,输入流等信息,然后根据业务逻辑进行操作。...当然如果是默认配置,路径在 tomcat 工作目录下,是不需要过多担心权限问题的。但是如果配置了其他路径,就需要考虑权限问题。
在上一篇文章中我们主要介绍 tomcat nio 中的服务端事件 SSE,在这里我们主要介绍 tomcat 中的异步。...通过继续调用之前文章中介绍的 tomcat request action(ActionCode.ASYNC_START,this) 方法,最终会调到 AsyncStateMachine 对象实例的 asyncStart...开启异步并不会触发异步 listener 的 start 事件,因为开启异步构造的上下文对象并没有设置 listener(可能 tomcat 异步实现者并没有考虑这个问题)。
一、 前言 二、 Connector 研究过tomcat的童鞋应该都知道tomcat的容器构造: ?...createExecutor(); } initializeConnectionLatch(); //启动poller 线程,nio...sc.run(); } catch (RejectedExecutionException rx) { ... } return true; } 3.4 总结 NIO...是可以多个线程来接受客户端的链接,这个和bio是一样的,不一样在于是NIO会把接受到的链接放入事件队列,然后多个poll线程会从事件队列获取事件,并且NIO可以每个poll线程去监听多个链接socket
在上一篇文章里我们主要介绍了 tomcat NIO 的基础,多路复用。...多路复用除了 java NIO API 之外还需不同操作系统的底层支持,对于 linux 系统来说,就是我们上一篇文章介绍的 epoll 模型,在这里我们主要介绍 tomcat NIO 的主要涉及的 java...我们可以把 tomcat NIO 涉及的主要 java 类大致分为两种类型,一种类型是框架类,主要实现 NIO 的架构。...另一种类型是数据处理类,实现读写的封装,类似于 Request 和 Response ,在这里我们主要介绍 tomcat NIO 涉及的框架类,下图展示了这些类: ?...目前先写到这里,下一篇文章里我们继续介绍 tomcat NIO 中处理请求和响应相关的类以及这些类的作用。
在上一篇文章里我们主要介绍了 tomcat nio 中 block poller 线程的阻塞与唤醒,当 tomcat io 线程读取请求实体数据不可读或者写入响应数据不可写的时候,就会注册事件到 block...在这里我们主要介绍 tomcat 中的长连接。 tomcat 数据的读写都在 io 线程中,根据以前文章 io 线程序列图如下: ?...除了以上在 tomcat io 线程中决定是否使用长连接之外,poller 线程也可以决定是否使用长连接。...根据以上分析对于 tomcat 长连接的总结如下: tomcat 默认就是开启长连接的。 对于 http1.0 协议不使用长连接。...目前先写到这里,下一篇文章里我们继续介绍 tomcat 中的文件上传。
在上一篇文章里我们主要介绍了 tomcat NIO 的数据处理类,即实现读写封装的Request 和 Response,在这里我们主要介绍 NIO 整体架构。...对于 tomcat NIO 来说,是由一系列框架类和数据读写类来组成的,同时这些类运行在不同的线程中,共同维持整个 tomcat NIO 架构。...这些类和线程共同组成的 tomcat NIO 整体结构如下所示: ?...BlockPoller线程 tomcat NIO 架构中会有 block poller 线程,其核心功能由以前文章中介绍的 BlockPoller 类来实现,BlockPoller 实例会有一个 NIO...目前先写到这里,下一篇文章里我们继续介绍 tomcat NIO 中的 acceptor 线程。
在上一篇文章里我们主要介绍了 tomcat 中请求数据的读取,这里主要介绍对于响应数据的写入。 响应数据写入的流程 ?...然后在调用之前文章介绍的 NioSocketWrapper 中的 CountDownLatch 类型 writeLatch 属性的 await() 方法,使当前线程(一般是tomcat io线程)在 writeLatch...目前先写到这里,下一篇文章里我们继续介绍 tomcat nio 中的 BlockPoller 线程。
重点摘要:BIO(同步阻塞IO)、NIO(同步非阻塞IO)、AIO(异步IO)、线程池、Selector(选择器)、Buffer(缓冲)、Channel(通道) ? ? ? ?
在上一篇文章中我们主要介绍 tomcat nio 中异步的开启,主要包括以下的总结: 开启异步的时候不会执行 start 事件函数的,因为此时构造的异步上下文对象的源码中并没有设置事件监听器(可能 tomcat...一直调用到 SocketWrapperBase 对象实例的 execute() 方法,这里我们分析 execute() 核心方法: 上述方法首先通过 endpoint.getExecutor() 调用得到 tomcat...将异步任务委托到 tomcat io 线程池中运行。 细心的你就会发现,在 tomcat 原生异步实现的 API 中,任务是占用了 io 线程的。...所以综上总结对于 tomcat 异步原生 API 实现中, AsyncContext.start() 方法会把异步任务交由 tomcat io 线程池运行,这样在大量启动异步任务的时候可能会过度占用 io...目前先写到这里,下一篇文章里我们继续介绍 tomcat io 中的异步结束。
在上一篇文章里我们主要介绍了 tomcat NIO 实现的相关架构类,在这里我们主要介绍数据处理类,即实现读写封装的 Request 和 Response 。...在 tomcat NIO 的实现里,会有一系列处理数据读写的类。并且 tomcat 也实现了servlet 标准,是 servlet 容器。...用于当数据不可读,或者不可写的时候对 tomcat io 线程的阻塞,即如果数据不可读写,tomcat io 线程会分别在 readLatch 实例和 writeLatch 实例上等待。...里面包含事件队列SynchronizedQueue ,java NIO 事件轮询对象 selector,同时还包含了并发事件计数器 weakupCounter。...目前先写到这里,下一篇文章里我们继续介绍 tomcat NIO 中实现的主要架构和流程。
在上一篇文章中我们主要介绍 tomcat nio 中对文件上传的原生支持,其本质是通过调用消费 servlet inputstream 相关 API ,先把文件上传到 tomcat 的工作目录中。...这种上传方式需要考虑 tomcat 工作目录磁盘空间大小,清理,权限等问题,由于涉及网络设备,磁盘设备,os 内核空间和程序的用户空间多次切换,所以在数量比较大的情况下会有效率问题。...对于原生上传来说,是把 http 请求的文件输入流写入 tomcat 工作目录的磁盘中,流式上传的思路是不把输入流写入磁盘,而是直接把输入流交给应用程序,这样就避免了写磁盘的中转操作,提高了效率。...避免了和磁盘设备打交道,提高了效率,同时也不必考虑 tomcat 工作目录磁盘大小,权限,清空等问题。...目前先写到这里,下一篇文章里我们继续介绍 tomcat 中的 server sent event(SSE) 。
最近看了一个Tomcat7优化的文档,虽然项目暂时用不到,但还是简单的配置了一下。这里要说的是Tomcat的三种运行模式(BIO, NIO, APR)。...Tomcat7或以下,在Linux系统中默认使用这种方式。 NIO: 利用Java的异步IO处理,可以通过少量的线程处理大量的请求。 Tomcat8在Linux系统中默认使用这种方式。...Tomcat7或Tomcat8在Win7或以上的系统中启动默认使用这种方式。 Linux如果安装了apr和native,Tomcat直接启动就支持apr。...安装方法:http://www.cnblogs.com/nb-blog/p/5278502.html) 官方对这三种的区别的详细说明: Java Blocking Connector Java Nio...Blocking Connector APR/native Connector BIO NIO
在上一篇文章里我们主要介绍了 tomcat io 线程的 overall 调用流程以及关键类SocketProcessor 和 ConnectionHandler 的核心逻辑总结,这里我们主要来介绍剩余其它的核心类...该方法会去用 tomcat 的 request 和 response 创建 servlet 的标准 request 和 response ,并设置其关联关系,即把 tomcat request 关联到...servlet request ,把 tomcat response 关联到 servlet response 。...目前先写到这里,下一篇文章里我们继续介绍 tomcat io 线程中的读写。
int read(ByteBuffer dst) throws IOException { return sc.read(dst); } 根据上述代码,请求行和请求头的读取本质是调用 java NIO...对于 tomcat 数据读取总结如下: 对于请求行,请求头和请求体的读取默认(不开启异步)都在 tomcat io 线程中进行。...对于请求行和请求头的读取是非阻塞读取,即不阻塞 tomcat io 线程,如果没有读取到数据,则由 poll 线程继续监测下次数据的到来。...然后利用 NioSocketWrapper 对象中的 readLatch 来阻塞 tomcat io 线程。...对于 tomcat io 线程阻塞时间为读超时,默认不配置为 -1,这时超时时间为 Long.MAX_VALUE 毫秒。
领取专属 10元无门槛券
手把手带您无忧上云