快速业务通道

nio框架中的多个Selector结构 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22

nio框架中的多个Selector结构

时间:2010-12-19 BlogJava dennis

随着并发数量的提高,传统nio框架采用一个Selector来支撑大量连接事件的 管理和触发已经遇到瓶颈,因此现在各种nio框架的新版本都采用多个 Selector 并存的结构,由多个Selector均衡地去管理大量连接。这里以Mina和Grizzly的实现为例。

在Mina 2.0中,Selector的管理是由 org.apache.mina.transport.socket.nio.NioProcessor来处理,每个 NioProcessor对象保存一个Selector,负责具体的select、wakeup、channel的 注册和取消、读写事件的注册和判断、实际的IO读写操作等等,核心代码如下:

public NioProcessor(Executor executor) {          super(executor);          try {              // Open a new selector              selector = Selector.open();          } catch (IOException e) {              throw new RuntimeIoException("Failed to  open a selector.", e);          }      }      protected int select(long timeout) throws Exception  {          return selector.select(timeout);      }      protected boolean isInterestedInRead(NioSession session)  {          SelectionKey key = session.getSelectionKey ();          return key.isValid() &&  (key.interestOps() & SelectionKey.OP_READ) != 0;      }      protected boolean isInterestedInWrite(NioSession  session) {          SelectionKey key = session.getSelectionKey ();          return key.isValid() &&  (key.interestOps() & SelectionKey.OP_WRITE) != 0;      }      protected int read(NioSession session, IoBuffer buf)  throws Exception {          return session.getChannel().read(buf.buf());      }      protected int write(NioSession session, IoBuffer buf,  int length) throws Exception {          if (buf.remaining() <= length) {              return session.getChannel().write(buf.buf ());          } else {              int oldLimit = buf.limit();              buf.limit(buf.position() + length);              try {                  return session.getChannel().write (buf.buf());              } finally {                  buf.limit(oldLimit);              }          }      }

nio框架中的多个Selector结构(2)

时间:2010-12-19 BlogJava dennis

这些方法的调用都是通过AbstractPollingIoProcessor来处理,这个类里可 以看到一个nio框架的核心逻辑,注册、select、派发,具体因为与本文主题不 合,不再展开。NioProcessor的初始化是在NioSocketAcceptor的构造方法中调 用的:

public NioSocketAcceptor() {          super(new DefaultSocketSessionConfig(),  NioProcessor.class);          ((DefaultSocketSessionConfig) getSessionConfig ()).init(this);      }

直接调用了父类AbstractPollingIoAcceptor的构造函数,在其中我们可以看 到,默认是启动了一个SimpleIoProcessorPool来包装N

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号