接上篇《攔截器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的源碼分析到這裏就算是結束了,晚上我會作一個大的索引。後面仍是有新的發現還會繼續更新的。這套框架裏還有好多值得挖掘的地方,時間匆忙沒有挖的很深,更多的東西你們能夠從源碼中得到。