public interface Reactor {
void register(ReactorHandler handler);
void deregister(ReactorHandler handler);
void interest(ReactorHandler handler, int ops);
看起来Reactor 是蛮简单的,但是却是困惑我最久的地方。
public void run() {
try {
while (!close) {
beforeSelect();
if (close) // after beforeSelect, close may be true
break;
try {
selector.select(SELECT_TIMEOUT);
} catch (IOException e) {
log.error(e, e);
break;
}
afterSelect();
}
} finally {
DefaultReactor.this.stop();
}
}
Reactor启动之后,会不停的通过selector去查看各个频道的状态,然后通过ReactorHandler 执行对应状态的操作。
private void processSelectedKeys() {
for (Iterator iter = selector.selectedKeys().iterator(); iter.hasNext();) {
SelectionKey key = (SelectionKey) iter.next();
iter.remove();
key.interestOps(key.interestOps() & ~key.readyOps());
Attachment attachment = (Attachment) key.attachment();
ReactorHandler handler = attachment.handler;
if (key.isWritable()) // do not check session timeout when writing
attachment.writing = true;
if (key.isAcceptable())
handler.onAcceptable();
if (key.isConnectable())
handler.onConnectable();
if (key.isValid() && key.isReadable())
handler.onReadable();
if (key.isValid() && key.isWritable())
handler.onWritable();
}
}
那session的sockerchannel怎么和selector产生联系呢。通过register和deregister方法。那状态的改变呢,是通过interest方法。
ReactorHandler是怎么执行的呢。基本上是通过SessionFilterChain执行对应的方法。SessionFilter可以直接通过session添加:session.addSessionFilter(XXX);