加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 站长资讯 > 外闻 > 正文

查漏补缺:连接器在Tomcat中是如何设计的

发布时间:2019-09-24 16:26:56 所属栏目:外闻 来源:今日头条
导读:副标题#e# 从连接器(Connector)源码说起 既然是来解析连接器(Connector),那么我们直接从源码入手,后面所有源码我会剔除不重要部分,所以会忽略大部分源码细节,只关注流程。源码如下(高能预警,大量代码): publicclassConnectorextendsLifecycleMBeanBas

其实就是主要调用 protocolHandler.start()方法,继续跟踪,为了方便表述,我会把接下来的代码统一放在一起说明,代码如下:

  1. //1.类:AbstractProtocol implements ProtocolHandler, 
  2.  MBeanRegistration 
  3.  public void start() throws Exception { 
  4.  // 省略部分代码 
  5.  endpoint.start(); 
  6.  } 
  7. //2. 类:AbstractEndPoint  
  8. public final void start() throws Exception { 
  9.  // 省略部分代码 
  10.  startInternal(); 
  11.  } 
  12.  /**3.类:NioEndPoint extends AbstractJsseEndpoint<NioChannel,SocketChannel> 
  13.  * Start the NIO endpoint, creating acceptor, poller threads. 
  14.  */ 
  15.  @Override 
  16.  public void startInternal() throws Exception { 
  17.  //省略部分代码 
  18.   
  19.  // Start poller thread 
  20.  poller = new Poller(); 
  21.  Thread pollerThread = new Thread(poller, getName() + "-ClientPoller"); 
  22.  pollerThread.setPriority(threadPriority); 
  23.  pollerThread.setDaemon(true); 
  24.  pollerThread.start(); 
  25.  startAcceptorThread(); 
  26.  } 
  27.  } 

到这里,其实整个启动代码就完成了,我们看到最后是在NioEndPoint创建了一个Poller,并且启动它,这里需要补充说明下,这里只是以NioEndPoint为示列,其实Tomcat 主要提供了三种实现,分别是AprEndPoint,NioEndPoint,Nio2EndPoint,这里表示了tomcat支持的I/O模型:

  • APR:采用 Apache 可移植运行库实现,它根据不同操作系统,分别用c重写了大部分IO和系统线程操作模块,据说性能要比其他模式要好(未实测)。
  • NIO:非阻塞 I/O
  • NIO.2:异步 I/O

上述代码主要是开启两个线程,一个是Poller,一个是开启Acceptor,既然是线程,核心的代码肯定是run方法,我们来查看源码,代码如下:

  1. //4.类:Acceptor<U> implements Runnable 
  2.  public void run() { 
  3.  //省略了部分代码 
  4.  U socket = null; 
  5.  socket = endpoint.serverSocketAccept(); 
  6.  // Configure the socket 
  7.  if (endpoint.isRunning() && !endpoint.isPaused()) { 
  8.  // setSocketOptions() will hand the socket off to 
  9.  // an appropriate processor if successful 
  10.  //核心逻辑 
  11.  if (!endpoint.setSocketOptions(socket)) { 
  12.  endpoint.closeSocket(socket); 
  13.  } 
  14.  } else { 
  15.  endpoint.destroySocket(socket); 
  16.  } 
  17.   
  18.  state = AcceptorState.ENDED; 
  19. //5.类:NioEndpoint 
  20. protected boolean setSocketOptions(SocketChannel socket) { 
  21.  // Process the connection 
  22.  //省略部分代码 
  23.  try { 
  24.  // Disable blocking, polling will be used 
  25.  socket.configureBlocking(false); 
  26.  Socket sock = socket.socket(); 
  27.  socketProperties.setProperties(sock); 
  28.  NioSocketWrapper socketWrapper = new NioSocketWrapper(channel, this); 
  29.  channel.setSocketWrapper(socketWrapper); 
  30.  socketWrapper.setReadTimeout(getConnectionTimeout()); 
  31.  socketWrapper.setWriteTimeout(getConnectionTimeout()); 
  32.  socketWrapper.setKeepAliveLeft(NioEndpoint.this.getMaxKeepAliveRequests()); 
  33.  socketWrapper.setSecure(isSSLEnabled()); 
  34.  //核心逻辑 
  35.  poller.register(channel, socketWrapper); 
  36.  return true; 
  37.   
  38.  } 

(编辑:应用网_丽江站长网)

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

热点阅读