Reactor模式和NIO.docxVIP

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Reactor模式和NIO

当前分布式计算 Web Services盛行天下,这些网络服务的底层都离不开对socket的操作。他们都有一个共同的结构:1. Read request2. Decode request3. Process service4. Encode reply5. Send reply经典的网络服务的设计如下图,在每个线程中完成对数据的处理:但这种模式在用户负载增加时,性能将下降非常的快。我们需要重新寻找一个新的方案,保持数据处理的流畅,很显然,事件触发机制是最好的解决办法,当有事件发生时,会触动handler,然后开始数据的处理。Reactor模式类似于AWT中的Event处理:Reactor模式参与者1.Reactor 负责响应IO事件,一旦发生,广播发送给相应的Handler去处理,这类似于AWT的thread2.Handler 是负责非堵塞行为,类似于AWT ActionListeners;同时负责将handlers与event事件绑定,类似于AWT addActionListener如图:Java的NIO为reactor模式提供了实现的基础机制,它的Selector当发现某个channel有数据时,会通过SlectorKey来告知我们,在此我们实现事件和handler的绑定。我们来看看Reactor模式代码:Java代码 file:///C:\Users\ZhouPing\Desktop\技术相关\Reactor模式和NIO(转载)%20-%20JAVA夜无眠%20-%20ITeye技术网站.mhtjavascript:void()public class Reactor implements Runnable{  final Selector selector;  final ServerSocketChannel serverSocket;  Reactor(int port) throws IOException {  selector = Selector.open();  serverSocket = ServerSocketChannel.open();  InetSocketAddress address = new InetSocketAddress(InetAddress.getLocalHost(),port);  serverSocket.socket().bind(address);  serverSocket.configureBlocking(false);  //向selector注册该channel SelectionKey sk =serverSocket.register(selector,SelectionKey.OP_ACCEPT);  logger.debug(--Start serverSocket.register!);  //利用sk的attache功能绑定Acceptor 如果有事情,触发Acceptor  sk.attach(new Acceptor());  logger.debug(--attach(new Acceptor()!);  }  public void run() { // normally in a new Thread  try {  while (!Thread.interrupted())  {  selector.select();  Set selected = selector.selectedKeys();  Iterator it = selected.iterator();  //Selector如果发现channel有OP_ACCEPT或READ事件发生,下列遍历就会进行。  while (it.hasNext())  //来一个事件 第一次触发一个accepter线程  //以后触发SocketReadHandler  dispatch((SelectionKey)(it.next()));  selected.clear();  }  }catch (IOException ex) {  logger.debug(reactor stop!+ex);  }  }  //运行Acceptor或SocketReadHandler  void dispatch(SelectionKey k) {  Runnable r = (Runnable)(k.attachment());  if (r != null){  // r.run();  }  }  class Acceptor implements Runnable { // inner  public void run() {  try {  logger.debug(--rea

您可能关注的文档

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档