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

Java AIO初探(异步网络IO)

 2009-09-22 00:00:00 来源:WEB开发网   
核心提示: write调用返回的结果与read一样是一个Future<Integer>,而write的CompletionHandler处理的核心逻辑大概是这样:@Overridepublicvoidcompleted(Integerresult,AbstractAioSessionsessio

write调用返回的结果与read一样是一个Future<Integer>,而write的CompletionHandler处理的核心逻辑大概是这样:

@Override
    public void completed(Integer result, AbstractAioSession session) {
        if (log.isDebugEnabled())
            log.debug("Session(" + session.getRemoteSocketAddress()
                    + ") writen " + result + " bytes");
                
        WriteMessage writeMessage;
        Queue<WriteMessage> writeQueue = session.getWriteQueue();
        synchronized (writeQueue) {
            writeMessage = writeQueue.peek();
            if (writeMessage.getWriteBuffer() == null
                    || !writeMessage.getWriteBuffer().hasRemaining()) {
                writeQueue.remove();
                if (writeMessage.getWriteFuture() != null) {
                    writeMessage.getWriteFuture().setResult(Boolean.TRUE);
                }
                try {
                    session.getHandler().onMessageSent(session,
                            writeMessage.getMessage());
                } catch (Exception e) {
                    session.onException(e);
                }
                writeMessage = writeQueue.peek();
            }
        }
        if (writeMessage != null) {
            try {
                session.pendingWrite(writeMessage);
            } catch (IOException e) {
                session.onException(e);
                session.close();
            }
        }
    }

compete方法中的result就是实际写入的字节数,然后我们判断消息的缓冲区是否还有剩余,如果没有就将消息从队列中移除,如果队列中还有消息,那么继续发起write调用。

重复一下,这里引用的代码都是yanf4j aio分支中的源码,感兴趣的朋友可以直接check out出来看看: http://yanf4j.googlecode.com/svn/branches/yanf4j-aio。

在引入了aio之后,java对于网络层的支持已经非常完善,该有的都有了,java也已经成为服务器开发的首选语言之一。java的弱项在于对内存的管理上,由于这一切都交给了GC,因此在高性能的网络服务器上还是Cpp的天下。java这种单一堆模型比之erlang的进程内堆模型还是有差距,很难做到高效的垃圾回收和细粒度的内存管理。

这里仅仅是介绍了aio开发的核心流程,对于一个网络框架来说,还需要考虑超时的处理、缓冲buffer的处理、业务层和网络层的切分、可扩展性、性能的可调性以及一定的通用性要求。

上一页  4 5 6 7 8 9 

Tags:Java AIO 初探

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