mina源码浅析——读写发操作
Mina用户Handler提供的事件处理如下:
@Override
public void messageReceived(IoSession session,
Object message)
public void
messageSent(IoSession session,
Object message)
public void sessionCreated(IoSession session)
public void sessionOpened(IoSession session)
public void sessionClosed(IoSession session)
…………
只要重写上面的方法,并将IOHandler到添加到处理链就可以很方便实现想要的业务逻辑。
有关IOFilterChain类的类图如下:
1)mina的读操作:
从与线程的类AbstractPoolingIOProcessor将MSG通过过滤器链一直传递到业务逻辑处理的IOHandler,如下:
其中Entry是可以认为是IOFilter的进入接口,其具体实现为EntryImpl类。两者有点类似于Netty中Handler与HandlerContext,都有点象是包裹关系。也可以起到为filter起名的作用。(构成name-filter对)
2)Mina的写操作:
Mina的写操作是有IOSession.write()开始的
Mina的读写都是异步的,write()出去的只是WriteRequest,写操作的请求由每个session对应的一个writeRequestQueue维护
3)Mina的sent操作
当数据发送的时候,MessageSent事件通过过滤器链将事件传递给IOHeadler 以寻求得到相应的业务处理。mina的IO异步其实是通过IoFuture来实现的
IoFuture通过IoFutureListener被IoSession绑定
IoFuture包括四个子接口:分别是ConnectFuture、 ReadFuture 、WriteFuture 、CloseFuture。对应的有4个实现接口的默认类。并且这四个类都是由DefaultIOFuture继承而来,而DefaultIOFuture是IOFuture接口的实现类,主要实现了对await、join、notify的操作,以及处理死锁的操作。
await()主要是为了等待异步操作完成,并通知其他等待者,而其他线程抢占执行,最后是通知相关的listener。IOFuture的类图结构大致如下:
以ReadFuture为例,它将在IOSession.read()中被用到,该接口方法由AbstractIOSession.read()实现。代码如下:
可以看到read()操作知识在准备好的readyReadFuture队列中选取了一个并将它返回。类似的,Write()操作也只是往队列里写入一个future。
可见mina的在IOSession这一层中,读写的实际上是Future。而IoFuture可以通过IOFutureLIstener监听到一个特定的IoSession的异步IO操作是否完成。
mina2中的future通过await和notify控制了操作的连续性,上层(session)通过队列来缓冲各种任务,各种任务通过竞争线程得到执行。
- 上一篇: Mina传输大数组,多路解码,粘包问题的处理
- 下一篇: fstat & stat 使用