论坛首页 Java企业应用论坛

Mina原理草图及注释

浏览 3088 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (3)
作者 正文
   发表时间:2011-01-18   最后修改:2011-01-19

今天先画一个草图备忘,明天再注释一下。

 

 

上图是Mina的Server端内部运行图,Client处表示外部的客户端通过Socket建立连接。

图中IoAcceptor对应NioSocketAcceptor类,是用来接受Socket请求的。

 

图中用灰色的齿轮表示,小齿轮表示他一直可以干活,运转不息。黄色的小齿轮则表示一个运行在线程池上的任务,表示它是运转在线程池之上的。

 

1、服务端在创建NioSocketAcceptor实现时,会生成一个线程池,此线程池用来执行一个接受请求的任务,这个任务叫Acceptor(可以在AbstractPollingIoAcceptor类中找到其实现类),Acceptor会开一个Selector,用来监听NIO中的ACCEPT事件。任务初始化时并没有执行,而在调用NioSocketAcceptor实例的bind方法时,则会启动对指定端口的ACCEPT事件的监听。

 

2、SimpleIoProcessorPool是在NioSocketAcceptor实例化时创建的,其上有N+1(N=CPU的个数)个NIOProcessor来处理实际IO的读写事件,每个NIOProcessor都会对应一个Selector,来监听Socket中的读写事件。实际对读写的操作也是在一个SimpleIoProcessorPool实例化好的一个线程池中以任务的形式执行,这个任务叫Processor(可以在AbstractPollingIoProcessor类中找到其实现)。

 

1、2中都有提到Selector,这也就是Mina中处理IO事件引入的双Selector的模型,是对Reactor模式的扩展。

下图展示了Mina中reactor模型:

 

而传统的reactor模型则如下:

 

 

一次请求的过程如下:

Client通过Socket连接服务器,先是由Acceptor接收到请求连接的事件(即ACCEPT事件)。此事件由Acceptor进行处理,会创建一条Socket连接,并将此连接和一个NIOProcessor关联,这个过程通过图中的 连接分配器 进行,连接分配器会均衡的将Socket和不同的NIOProcessor绑定(轮流分配),绑定完成后,会在NIOProcessor上进行读写事件的监听,而读写的实际处理则分配给Processor任务完成。当有读写事件发生时,就会通知到对应的Processor进行数据处理。

 

先写这么多吧,可以结合Mina的代码来看一下上面的流程。个人理解,希望对想对Mina了解的兄弟有点帮助。

  • 大小: 41.4 KB
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics