Mina源码阅读笔记(八)—Mina拦截器器的末端IoHandler

之前在写service的时候提过IoHandler,当时把它作为一种简单的模式简单扫视了一下,不是很放心,今天还是拿出来单独写点儿,作为这个系列的结束吧。也正好handler就是filter chain的最末端。这个系列还差proxy部分没有写,这部分我没有用过,等以后用到了再补上吧。

我们其实只要看看IoHandler接口中定义的一些方法就能明白它具体是干嘛用的:

  • sessionCreated
  • sessionOpened
  • sessionClosed
  • sessionIdle
  • exceptionCaught
  • messageReceived
  • messageSent

IoHandler的结构和IoFilter有点儿相似,不仅也用了adapter模式,也实现了自己的handler chain。在IoHandler中的定义了上面描述的七个操作,在它的直接继承类IoHandlerAdapter没有做任何操纵,而是将具体的实现交给了开发者。一般我们都会写自己的Handler去继承IoHandlerAdapter,当然也有更直接的去实现IoHandler

这样看这个handler未必也太简单了,别急,在org.apache.mina.handler.*中还有handler chain的相关操作。在这个包内,最原始的接口是IoHandlerCommand,它的实现类叫IoHnadlerChain,这个命名有点儿奇怪,不像IoFilterChain和DefaultIoFilterChain容易辨认之间的关系。

IoHandlerCommand接口内也定义一个内部类NextCommand,和IoFilter中定义NextFilter道理一样,开放直接操作让子类去实现。如果你去读IoHandlerChain的代码,你会发现chain的实现和filter chain几乎一样,都是用了双向链表来完成addFirst和addLast等操作。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private final Map name2entry = new ConcurrentHashMap();
 
     private final Entry head;
 
     private final Entry tail;
 
     /**
      * Creates a new, empty chain of {@link IoHandlerCommand}s.
      */
     public IoHandlerChain() {
         head = new Entry( null , null , "head" , createHeadCommand());
         tail = new Entry(head, null , "tail" , createTailCommand());
         head.nextEntry = tail;
     }

IoHandlerChain中也有个Entry,是一个name-InHandlerCommand对,用来作为一个链表的节点。我们还要注意handlersession是紧密结合的,可以说handler出现的目的是为了更好的协助session完成IO操作。我们无法对session直接进行操作,但是可以通过继承handler去做些改变。有了chain的实现,接下来就是如何将chainhandler结合起来了。ChainedIoHandler继承了IoHandlerAdapter并且引用了IoHandlerChain完成了与IoHandlersession的衔接。

这节很简单,就是要明白handler是给开发者的一个接口去处理控制IO事件。Mina也为我们提供了很多已经部分实现的、比较便捷的handler:

l  StreamIoHandler:处理异步的IO stream。继承这个类只要实现processStreamIo方法去处理业务逻辑即可。我之前用过这个来处理传输文件,效果还不错。

l  DemuxingIoHandler:多路复用的IoHandler。通过控制MessageHandler去控制多路复用的messageReceived操作。

Mina的源码分析到这里就算是结束了,晚上我会做一个大的索引。后面还是有新的发现还会继续更新的。这套框架里还有好多值得挖掘的地方,时间匆忙没有挖的很深,更多的东西大家可以从源码中获得。

你可能感兴趣的:(MINA)