天天看點

Apache mina流程分析

Apache mina工作流介紹

apache mina的整體工作流程包含了幾個重要的概念群組件,分别是IoService,IoProcessor,IoHandler和IoFilter,在弄清楚整體的運作流程之前需要先介紹下各個元件各自的作用。

IoService

這個是mina請求接受器(Acceptor)以及連接配接器(Connector)的一個抽象的父類,作用就是提供連接配接和接受請求的服務。

IoProcessor

請求處理器,負責請求的處理工作,包括監聽事件的更改,filterChain的建立,響應事件的調用(sessionCreated、sessionOpened、messageRecieved等)以及IO讀寫操作。

IoHandler

IoHandler其實就是負責響應事件對應處理的,不管是來自于IoService還是IoProcessor的響應事件發生時,都會調用到IoHandler裡面的對應的處理方法,這部分是留給開發者去繼承然後覆寫。

IoFilter

IoFilter是過濾器,其實就是一個裝飾者模式,開發者繼承這個接口然後實作對應的方法,例如sessionCreated、sessionOpened、messageRecieved等等,然後在這些方法裡面加入自己的工作代碼,然後調用NextFilter.sessionCreated等等來将調用在filterChain裡面傳遞下去。

流程

整體的流程就是開啟IoService,如果是Acceptor那麼就是開一個監聽的服務,然後當有請求到來的時候會将請求對應到一個session,配置設定相應的sessionid,然後将session配置設定給多個子Processor中的一個去處理,而processor會再處理過程中,發出事件響應調用,例如sessionCreated、sessionOpened、messageRecieved等等,事件響應調用會沿着IoFilterChain一直傳遞,最後到IoHandler去處理。

mina的NIO模式

mina采用了java的NIO來處理IO操作,并且整體的設計架構采用的是主Reactor+多個子Reactor+ThreadPool的模式,主Reactor用來監聽請求,然後接受請求,這裡采用了線程池模型,然後子Reactor用來處理請求,也采用了線程池模型。一次請求會封裝成一個session,每次請求的session都是不同的,會将session根據sessionid對預設的Processor數目求餘來配置設定session給Processor,然後每個processor通過線程池的方式去處理session對應的請求。

這種模式具有很好地适應性,能根據實際的運作環境來合理的配置子Reactor的數目以及線程池的大小。其中預設的Reactor數目是處理器核心數目+1。