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 |