mina源码浅析——读写发操作

3 篇文章 0 订阅

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对)

2Mina的写操作:

Mina的写操作是有IOSession.write()开始的

Mina的读写都是异步的,write()出去的只是WriteRequest,写操作的请求由每个session对应的一个writeRequestQueue维护


3Minasent操作

当数据发送的时候,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)通过队列来缓冲各种任务,各种任务通过竞争线程得到执行。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值