WEB开发网
开发学院软件开发Java Java AIO初探(异步网络IO) 阅读

Java AIO初探(异步网络IO)

 2009-09-22 00:00:00 来源:WEB开发网   
核心提示: 如果IO读失败,会返回失败产生的异常,Java AIO初探(异步网络IO)(8),这种情况下我们就主动关闭连接,通过session.close()方法,IO写的操作与此类似,不过通常写的话我们会在session中关联一个缓冲队列来处理,这个方法干了两件事情:关闭channel和取消read调用:

如果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");
        }
    }

上一页  3 4 5 6 7 8 9  下一页

Tags:Java AIO 初探

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接