`

Reactor设计模式

阅读更多

NIO用到的Reactor设计模式,下面的说明比较清楚,留作记录。

 

Reactor设计模式和观察者模式非常相似,但是它比观察者模式复杂,Reactor设计模式使用一个Selector对象相当于观察模者式里面观察者,每个
SocketServerChannal 实例和SocketChannal实例都相当于被观察者,当然它们需要在Selector对象里面注册,它们注册之后每个Channal实例都会分配一个 SelectionKey对象,SelectionKey对象可以attach(附带)一个对象,当Selector里面注册channal有事件发生 时,Selector就会产生一个遍历,这时候可以在遍历时候用attachment()方法把每个SelectionKey里面attach对象o 提出来,你可以在这个时候运行在o对象所属类O里面所定义方法,在这个方法里面可以使用socket.read()方法进行读取网络数据,将数据读出 后,可以将这些数据处理线程做成一个线程池,这样,数据读出后,立即扔到线程池中,这样加速处理速度。
注意在每次遍历提出SelectionKey,对注册channal读或写进行处理完毕之后,需要对channal进行重新注册,重新attach()对象。


使用nio提供Reactor设计模式,我们可以设计一个高性能nio服务器:
1、启动一个实现Runnable接口Reactor,在Reactor构造方法里面使用Selector.open()方法实例化一个Selector。
2、打开一个ServerSocketChannal,代码:
ServerSocketChannel serverSocket = ServerSocketChannel.open();
InetSocketAddress address = new InetSocketAddress(InetAddress.getLocalHost(),port);
serverSocket.socket().bind(address);
serverSocket.configureBlocking(false);
3、将ServerSocketChannal在selector里进行注册,代码:
SelectionKey sk =serverSocket.register(selector,SelectionKey.OP_ACCEPT);
4、给sk附带上一个事件处理对象,代码:
sk.attach(new Acceptor());
5、在Reactor类run方法里面对selector不停循环扫描,如果发现注册channal里面有OP_ACCEPT或READ事件发生,有话就触发一个selector附带上事件处理对象线程,处理完毕之后须将所有注册事件清空,代码如下:
public void run() {
try {
while (!Thread.interrupted())
{
selector.select();
Set selected = selector.selectedKeys();
Iterator it = selected.iterator();
while (it.hasNext())        
dispatch((SelectionKey)(it.next()));        
}
            selected.clear();
}catch (IOException ex) {       
}
}

void dispatch(SelectionKey k) {
Runnable r = (Runnable)(k.attachment());
if (r != null){
r.run();
}
}

6、我们可以在ServerSocketChannal注册sk里附带下面事件处理类对象(注意这是一个内部类):
class Acceptor implements Runnable {
public void run() {
try {
SocketChannel c = serverSocket.accept();
if (c != null)
//调用Handler来处理channel
new SocketReadHandler(selector, c);
}
catch(IOException ex) {     
}
}
}

7、SocketChannelattach功能将Hanlder和可能会发生事件channel链接在一起,当发生事件时,可以立即触发相应 链接Handler。我们在事件处理类里面需要做事情是在selector里面注册socketChannal,并附带上本handler,下一步有 事件触发时会调用本类run方法:
public class SocketReadHandler implements Runnable { 
final SocketChannel socket;    
final SelectionKey sk;
static final int READING = 0, SENDING = 1;  

  public SocketReadHandler(Selector sel, SocketChannel c)
throws IOException {
socket = c;
socket.configureBlocking(false);
sk = socket.register(sel, READING);
sk.attach(this);

    //将SelectionKey注册为可读,以便读取。
sk.interestOps(SelectionKey.OP_READ);
sel.wakeup();
}

  public void run() {
try{    
readRequest() ;
}catch(Exception ex){    
}
}

private void readRequest() throws Exception {
ByteBuffer input = ByteBuffer.allocate(1024);  
try{
int bytesRead = socket.read(input);
......

    //使用线程池处理request
requestHandle(new Request(socket,btt));
.....

  }catch(Exception e) {
}

}

分享到:
评论

相关推荐

    reactor-siemens.pdf

    ### Reactor设计模式详解 #### 一、引言 Reactor设计模式是一种广泛应用于网络编程中的行为模式,它主要用于处理并发服务请求。该模式通过分离事件处理与事件分发的功能来提高系统的可扩展性和可维护性。本文将...

    C++从0实现百万并发Reactor服务器完结13章

    Reactor翻译过来的意思是:反应堆,所以Reactor设计模式本质是基于事件驱动的。在Reactor设计模式中,存在如下几个角色。 Handle(事件)。Reactor整体是基于Handle进行驱动,这里的Handle叫做事件,可以类比为BIO...

    两种高性能IO设计模式(ReactorProactor)的比较

    Reactor设计模式是基于同步I/O的,事件分离者等待某个事件或者可应用或个操作的状态发生,然后事件分离者就把这个事件传给事先注册的事件处理函数或者回调函数,由后者来做实际的读写操作。 Proactor设计模式是和...

    socket-nio-single-reactor.zip

    Socket NIO 单 Reactor 模式是一种在 Java 中实现高性能网络编程的技术,它结合了非阻塞I/O(New I/O,即NIO)和Reactor设计模式。本示例代码旨在帮助开发者理解如何使用Java NIO和Reactor模式构建网络服务。尽管...

    Reactor模式和NIO

    Reactor模式是一种事件驱动的设计模式,主要用于解决高并发场景下的系统设计问题,而Java的NIO(Non-blocking Input/Output,非阻塞I/O)是Java平台提供的一种I/O模型,它支持基于事件的多路复用,为实现Reactor模式...

    网络编程和并发编程的框架EventMachine.zip

    EventMachine 是一个基于Reactor设计模式的、用于网络编程和并发编程的框架。Reactor模式描述了一种服务处理器,它接受事件并将其分发给已注册的事件处 理。这种模式的好处就是清晰的分离了时间分发和处理事件的应用...

    cs_communicate.tar.gz

    这里提到的"cs_communicate.tar.gz"压缩包文件包含了一个基于C++实现的网络通信模型,该模型是利用了Reactor设计模式。Reactor模式是一种事件驱动的设计模式,它用于处理多个并发连接请求,尤其适用于I/O密集型的...

    Scalable IO in Java -Doug Lea

    在这本书中,Lea深入探讨了Java NIO(非阻塞IO)和Reactor设计模式之间的关系,并且解释了如何通过它们来构建可扩展的网络服务。 Java NIO是一种在Java 1.4版本中引入的新的IO处理方式,它不同于传统的IO方式。传统...

    tpd_reactor_proactor.pdf

    Reactor 模式是一种事件驱动的设计模式,主要用于处理异步事件。在 Reactor 模式中,事件处理程序会注册自己感兴趣的事件,然后等待事件发生。一旦事件发生,事件处理程序就会被调用,执行相应的操作。 Reactor ...

    Redis相关面试题总结

    内容概要:本文深入解析了Redis为什么能够保持高速性能及其背后的工作机制,涵盖了内存操作、单线程操作、I/O多路复用技术和Reactor设计模式等多个方面的技术细节。同时还详细介绍了Redis在缓存、全页缓存、队列、...

    基于NIO的群聊.zip

    2. **Reactor设计模式**: - Reactor模式是一种事件驱动的设计模式,用于处理多个并发输入请求。在这个群聊项目中,Reactor采用单线程模型,意味着所有事件(如新的连接、读写事件)都在同一个线程中处理,这简化了...

    Observer and Reactor 观察者和recator的比较

    "Observer(观察者)"和"Reactor(反应器)"是两种广泛应用于并发和事件驱动编程的设计模式。 Observer模式的核心在于定义了一对多的依赖关系,当一个对象(主题)的状态发生改变时,所有依赖于它的对象都会被自动...

    ACE与设计模式

    《ACE与设计模式》 ACE(Adaptive Communication Environment)是一个跨平台的、开源的网络编程框架,它提供了许多用于构建高性能、高可用性分布式系统的服务。ACE的设计目标是帮助开发者处理网络通信中的复杂性,...

    Reactor Pattern (一)

    Reactor模式是一种事件驱动的设计模式,它主要用于处理并发I/O操作,通过将I/O事件的处理与事件处理程序解耦,实现高效的异步处理。在高并发环境下,Reactor模式可以显著提升系统性能,因为它避免了线程阻塞等待I/O...

    libevent参考手册中文版_libevent-2.1.5.pdf

    它基于Reactor设计模式,并提供了一个轻量级、跨平台、多线程的事件循环,广泛应用于网络服务器的开发中,能够处理多种I/O事件,并且支持多种后端。libevent支持多种操作系统,包括类Unix系统和Windows。它通过抽象...

    reactor模式源码

    Reacttor模式是一种用于处理大量并发I/O事件的设计模式,它在C++等多线程编程环境中广泛使用。这个模式的核心是通过一个中心调度组件(即Reacttor)来管理和分发来自多个I/O资源的事件,从而避免了单一线程处理所有...

    netty聊天室实例

    Reactor设计模式包含多个线程,负责处理连接、读写事件,确保并发处理能力。 - `Channel`和`EventLoop`是Netty中的重要概念,它们分别代表网络连接和处理连接事件的循环。 2. **Netty的ByteBuf**: - Netty的`...

    Scalable IO in Java by Doug Lea

    4. **reactor设计模式**:这是一种处理并发事件的模式,常用于网络编程。它通过一个或多个选择器来处理多个通道的事件,实现并发处理。Netty的EventLoop就是基于这一模式,它可以高效地处理I/O事件,并分发到相应的...

Global site tag (gtag.js) - Google Analytics