欢迎来到天天文库
浏览记录
ID:42576616
大小:214.27 KB
页数:7页
时间:2019-09-18
《Reactor模式和NIO》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、当前分布式计算 WebServices盛行天下,这些网络服务的底层都离不开对socket的操作。他们都有一个共同的结构:1.Readrequest2.Decoderequest3.Processservice4.Encodereply5.Sendreply经典的网络服务的设计如下图,在每个线程中完成对数据的处理:但这种模式在用户负载增加时,性能将下降非常的快。我们需要重新寻找一个新的方案,保持数据处理的流畅,很显然,事件触发机制是最好的解决办法,当有事件发生时,会触动handler,然后开始数据的处理。Reactor模式类似于AWT中的Event处理:Reactor
2、模式参与者1.Reactor负责响应IO事件,一旦发生,广播发送给相应的Handler去处理,这类似于AWT的thread2.Handler是负责非堵塞行为,类似于AWTActionListeners;同时负责将handlers与event事件绑定,类似于AWTaddActionListener如图:Java的NIO为reactor模式提供了实现的基础机制,它的Selector当发现某个channel有数据时,会通过SlectorKey来告知我们,在此我们实现事件和handler的绑定。我们来看看Reactor模式代码:Java代码1.publicclassReac
3、torimplementsRunnable{2.3. finalSelectorselector;4. finalServerSocketChannelserverSocket;5.6. Reactor(intport)throwsIOException{7. selector=Selector.open();8. serverSocket=ServerSocketChannel.open();9. InetSocketAddressaddress=newInetSocketAddress(InetAddress.getLocalHost()
4、,port);10. serverSocket.socket().bind(address);11.12. serverSocket.configureBlocking(false);13. //向selector注册该channel14. SelectionKeysk=serverSocket.register(selector,SelectionKey.OP_ACCEPT);15.16. logger.debug("-->StartserverSocket.register!");17.18. //利用sk的attache功能
5、绑定Acceptor如果有事情,触发Acceptor19. sk.attach(newAcceptor());20. logger.debug("-->attach(newAcceptor()!");21. }22.23.24. publicvoidrun(){//normallyinanewThread25. try{26. while(!Thread.interrupted())27. {28. selector.select();29. Setselected=selector.selectedKeys()
6、;1. Iteratorit=selected.iterator();2. //Selector如果发现channel有OP_ACCEPT或READ事件发生,下列遍历就会进行。3. while(it.hasNext())4. //来一个事件第一次触发一个accepter线程5. //以后触发SocketReadHandler6. dispatch((SelectionKey)(it.next()));7. selected.clear();8. }9. }catch
7、(IOExceptionex){10. logger.debug("reactorstop!"+ex);11. }12. }13.14. //运行Acceptor或SocketReadHandler15. voiddispatch(SelectionKeyk){16. Runnabler=(Runnable)(k.attachment());17. if(r!=null){18. //r.run();19.20. }21. }22.23. classAcceptorimplementsRunnable{/
此文档下载收益归作者所有