快速业务通道

Java AIO初探(异步网络IO) - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-21
                + ") read +" + result + " bytes");          if (result < 0) {              session.close();              return;          }          try {              if (result > 0) {                  session.updateTimeStamp();                  session.getReadBuffer().flip();                  session.decode();                  session.getReadBuffer().compact();              }          } finally {              try {                  session.pendingRead();              } catch (IOException e) {                  session.onException(e);                  session.close();              }          }          controller.checkSessionTimeout();      }      @Override      public void failed(Throwable exc, AbstractAioSession session) {          log.error("Session read error", exc);          session.onException(exc);          session.close();      } }

Java AIO初探(异步网络IO)(4)

时间:2011-01-07 BlogJava dennis

如果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.

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号