Java AIO初探(异步网络IO)
2009-09-22 00:00:00 来源:WEB开发网如果IO读失败,会返回失败产生的异常,这种情况下我们就主动关闭连接,通过session.close()方法,这个方法干了两件事情:关闭channel和取消read调用:
if (null != this.readFuture) {
this.readFuture.cancel(true);
}
this.asynchronousSocketChannel.close();
在读成功的情况下,我们还需要判断结果result是否小于0,如果小于0就表示对端关闭了,这种情况下我们也主动关闭连接并返回。如果读到一定字节,也就是result大于0的情况下,我们就尝试从读缓冲区中decode出消息,并派发给业务处理器的回调方法,最终通过pendingRead继续发起read调用等待socket的下一次可读。可见,我们并不需要自己去调用channel来进行IO读,而是操作系统帮你直接读到了缓冲区,然后给你一个结果表示读入了多少字节,你处理这个结果即可。而nonblocking IO框架中,是reactor通知用户线程socket可读了,然后用户线程自己去调用read进行实际读操作。这里还有个需要注意的地方,就是decode出来的消息的派发给业务处理器工作最好交给一个线程池来处理,避免阻塞group绑定的线程池。
IO写的操作与此类似,不过通常写的话我们会在session中关联一个缓冲队列来处理,没有完全写入或者等待写入的消息都存放在队列中,队列为空的情况下发起write调用:
protected void write0(WriteMessage message) {
boolean needWrite = false;
synchronized (this.writeQueue) {
needWrite = this.writeQueue.isEmpty();
this.writeQueue.offer(message);
}
if (needWrite) {
pendingWrite(message);
}
}
protected final void pendingWrite(WriteMessage message) {
message = preprocessWriteMessage(message);
if (!isClosed() && this.asynchronousSocketChannel.isOpen()) {
this.asynchronousSocketChannel.write(message.getWriteBuffer(),
this, this.writeCompletionHandler);
} else {
throw new IllegalStateException(
"Session Or Channel has been closed");
}
}
更多精彩
赞助商链接