加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 服务器 > 系统 > 正文

Tomcat 中的 NIO 源码分析

发布时间:2020-01-09 04:15:03 所属栏目:系统 来源:站长网
导读:副标题#e# 虽然本文的源码篇幅也不短,但是 Tomcat 的源码毕竟不像 Doug Lea 的并发源码那么变态,对于大部分读者来说,阅读难度比之前介绍的其他并发源码要简单一些,所以读者不要觉得有什么压力。 本文基于 Tomcat 当前(2018-03-20)最新版本 9.0.6。 先简

在 NioEndpoint init 的时候,我们开启了一个 ServerSocketChannel,后来 start 的时候,我们开启多个 acceptor(实际上,默认是 1 个),每个 acceptor 启动以后就开始循环调用 ServerSocketChannel 的 accept 方法获取新的连接,然后调用 endpoint.setSocketOptions(socket) 处理新的连接,之后再进入循环 accept 下一个连接。

到这里,大家应该也就知道了,为什么这个叫 acceptor 了吧?接下来,我们来看看 setSocketOptions 方法到底做了什么。

NioEndpoint # setSocketOptions

@Override 

protected booleansetSocketOptions(SocketChannel socket) { 

try { 

// 设置该 SocketChannel 为非阻塞模式 

socket.configureBlocking(false); 

Socket sock = socket.socket; 

// 设置 socket 的一些属性 

socketProperties.setProperties(sock); 

 

// 还记得 startInternal 的时候,说过了 nioChannels 是缓存用的。 

// 限于篇幅,这里的 NioChannel 就不展开了,它包括了 socket 和 buffer 

NioChannel channel = nioChannels.pop; 

if (channel == ) { 

// 主要是创建读和写的两个 buffer,默认地,读和写 buffer 都是 8192 字节,8k 

SocketBufferHandler bufhandler = new SocketBufferHandler( 

socketProperties.getAppReadBufSize, 

socketProperties.getAppWriteBufSize, 

socketProperties.getDirectBuffer); 

if (isSSLEnabled) { 

channel = new SecureNioChannel(socket, bufhandler, selectorPool, this); 

} else { 

channel = new NioChannel(socket, bufhandler); 

} else { 

channel.setIOChannel(socket); 

channel.reset; 

 

// getPoller0 会选取所有 poller 中的一个 poller 

getPoller0.register(channel); 

} catch (Throwable t) { 

ExceptionUtils.handleThrowable(t); 

try { 

log.error("",t); 

} catch (Throwable tt) { 

ExceptionUtils.handleThrowable(tt); 

// Tell to close the socket 

return false; 

return true; 

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读