接上篇《拦截器IoFilter》 java
以前在写service的时候提过IoHandler,当时把它做为一种简单的模式简单扫视了一下,不是很放心,今天仍是拿出来单独写点儿,做为这个系列的结束吧。也正好handler就是filter chain的最末端。这个系列还差proxy部分没有写,这部分我没有用过,等之后用到了再补上吧。 apache
咱们其实只要看看IoHandler接口中定义的一些方法就能明白它具体是干吗用的: session
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等操做。 源码分析
private final Map<String, Entry> name2entry = new ConcurrentHashMap<String, Entry>(); 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对,用来做为一个链表的节点。咱们还要注意handler和session是紧密结合的,能够说handler出现的目的是为了更好的协助session完成IO操做。咱们没法对session直接进行操做,可是能够经过继承handler去作些改变。有了chain的实现,接下来就是如何将chain和handler结合起来了。ChainedIoHandler继承了IoHandlerAdapter而且引用了IoHandlerChain完成了与IoHandler和session的衔接。 spa
这节很简单,就是要明白handler是给开发者的一个接口去处理控制IO事件。Mina也为咱们提供了不少已经部分实现的、比较便捷的handler: .net
l StreamIoHandler:处理异步的IO stream。继承这个类只要实现processStreamIo方法去处理业务逻辑便可。我以前用过这个来处理传输文件,效果还不错。 code
l DemuxingIoHandler:多路复用的IoHandler。经过控制MessageHandler去控制多路复用的messageReceived操做。 blog
Mina的源码分析到这里就算是结束了,晚上我会作一个大的索引。后面仍是有新的发现还会继续更新的。这套框架里还有好多值得挖掘的地方,时间匆忙没有挖的很深,更多的东西你们能够从源码中得到。