MINA自己提供了一個過濾器類: org.apache.mina.filter.keepalive . KeepAliveFilter ,該過濾器用於在IO空閒的時候發送而且反饋心跳包(keep-alive request/response)。
說到KeepAliveFilter這個類有必要先說一說其構造函數,即實例化該類須要些什麼,該類構造函數中參數有三個分別是:
(1)KeepAvlieMessageFactory: 該實例引用用於判斷接受與發送的包是不是心跳包,以及心跳請求包的實現
(2)IdleStatus: 該過濾器所關注的空閒狀態,默認認爲讀取空閒。 即當讀取通道空閒的時候發送心跳包
(3)KeepAliveRequestTimeoutHandler: 心跳包請求後超時無反饋狀況下的處理機制 默認爲CLOSE 即關閉鏈接
首先須要實現接口 KeepAliveMessageFactory 。 該接口中的抽象方法有:
html
Modifier and Type | Method and Description |
---|---|
Object | getRequest(IoSession session)
Returns a (new) keep-alive request message.
|
Object | getResponse(IoSession session, Object request)
Returns a (new) response message for the specified keep-alive request.
|
boolean | isRequest(IoSession session, Object message)
Returns true if and only if the specified message is a keep-alive request message.
|
boolean | isResponse(IoSession session, Object message)
Returns true if and only if the specified message is a keep-alive response message;
|
通常來講心跳機制主要分爲如下四類:
1, active 活躍型: 當讀取通道空閒的時候發送心跳請求,一旦該心跳請求被髮送,那麼須要在keepAliveRequestTimeout時間內接收到心跳反饋,不然 KeepAliveRequestTimeoutHandler將會被調用,當一個心跳請求包被接受到後,那麼心跳反饋也會當即發出。
針對活躍型心跳機制: KeepAliveMessageFactory 類的實現方法中: getRequest ( IoSession session)與 getResponse ( IoSession session, Object request)必須返回非空。
2, semi-active 半活躍型:當讀取通道空閒的時候發送心跳請求,然而並不在意心跳反饋有沒有,當一個心跳請求包被接收到後,那麼心跳反饋也會當即發出。
針對半活躍型心跳機制: KeepAliveMessageFactory 類的實現方法中: getRequest ( IoSession session)與 getResponse ( IoSession session, Object request)必須返回非空。而且心跳包請求後超時無反饋的處理機制設置爲KeepAliveRequestTimeoutHandler.NOOP(不作任何處理), KeepAliveRequestTimeoutHandler.LOG(只輸出警告信息不作其餘處理)
3, passive 被動型:當前IO不但願主動發送心跳請求,可是當接受到一個心跳請求後,那麼該心跳反饋也會當即發出。
針對被動型心跳機制: KeepAliveMessageFactory 類的實現方法中: getRequest ( IoSession session)必須反饋null 與 getResponse ( IoSession session, Object request)必須反饋non-null.
4, deaf speaker 聾子型: 當前IO會主動發送心跳請求,可是不想發送任何心跳反饋。
針對聾子型心跳機制: KeepAliveMessageFactory 類的實現方法中: getRequest ( IoSession session)必須反饋non-null與 getResponse ( IoSession session, Object request)必須反饋null,將 KeepAliveRequestTimeoutHandler 設置爲DEAF_SPEAKER.
5, sient-listener 持續監聽型:既不想發送心跳請求也不想發送心跳反饋。
針對持續監聽型心跳機制: KeepAliveMessageFactory 類的實現方法中: getRequest ( IoSession session)必須反饋null 與 getResponse ( IoSession session, Object request)必須反饋null.
心跳包請求超時後的處理機制:接口 KeepAliveRequestTimeoutHandler ,通常該處理主要是針對可以發送心跳請求的心跳機制。
1.CLOSE:關閉鏈接
2,LOG:輸出 警告信息
3,NOOP:不作任何處理
4,EXCEPTION:拋出異常
5,DEAF_SPEAKER:一個特殊的處理,中止當前過濾器對對心跳反饋監聽,所以讓過濾器丟失請求超時的偵測功能。(讓其變成聾子)
6,keepAliveRequestTimeout(KeepAliveFilter filter, IoSession session); 自定義處理
下面對客戶端與服務端和分別舉個例子:
服務器:
以被動型心跳機制爲例,服務器在接受到客戶端鏈接之後被動接受心跳請求,當在規定時間內沒有收到客戶端心跳請求時 將客戶端鏈接關閉
主要代碼以下:
java