《Apache MINA 2.0 使用者指南》第四章:會話
阿新 • • 發佈:2019-01-31
會話處於 MINA 的核心位置:每當一個客戶端連線到伺服器,一個新的會話會被建立,並會在客戶端關掉連線前一直儲存在記憶體中。
會話用於儲存連線的持久資訊,以及在請求處理過程中、會話的生命週期中伺服器可能需要用到的任何資訊。
會話的狀態
會話會有一個隨著時間演變的狀態:
寫閒置:在一段時間內沒有任何寫操作
同時閒置:在一段時間內既沒有讀操作也沒有寫操作
配置
對於特定會話可以設定以下不同的引數:
管理使用者定義的屬性
有可能需要儲存一些以後可能會用到的資料。這個使用每個會話關聯到的專用資料結構來實現。這是一個鍵值對組合,它可以儲存開發人員可能希望儲存的任何型別的資料。
例如,如果你想跟蹤會話建立以後使用者已傳送的請求次數,把它放進集合很容易:只需要建立將要關聯到這個值的鍵即可。
這樣就有了將儲存屬性放進會話的方法:屬性就是一個鍵值對,它可以從會話的容器中新增、刪除以及讀取。
容器在會話建立時會被自動建立,而在會話結束時會被清理。
定義容器
如上所述,容器是儲存鍵值對的容器,預設情況下是一個 Map,但是也可以定義做其他的資料結構,如果你想處理長壽命週期的資料,或者避免將所有大資料都儲存在記憶體:我們可以實現一個介面和一個工廠用於在會話建立時建立容器。
以下程式碼演示了會話初始化時容器的建立:
如果我們想要定義其他型別的容器,這裡是我們可以實現的工廠介面:
過濾器鏈
每個會話會關聯到一個過濾器鏈,在連入一個請求或者接收/發出訊息時這個過濾器鏈將會對其處理。這些過濾器針對於每個每個單獨的會話,在多數情況下,會為所有現有會話使用同一個過濾器鏈。
但是,也可以為單個會話動態修改過濾器鏈,比如為指定的會話的過濾器鏈新增一個日誌過濾器。
統計
每個會話也會保持對會話處理結束的一些記錄的跟蹤:
處理器
最後,並非最不重要的,每個會話會被附加到一個處理器,該處理器負責排程給你的應用的訊息。這個處理器也會通過使用會話傳送響應包,只需呼叫 write() 方法:
原文連結:http://mina.apache.org/mina-project/userguide/ch4-session/ch4-session.html。
會話用於儲存連線的持久資訊,以及在請求處理過程中、會話的生命週期中伺服器可能需要用到的任何資訊。
會話的狀態
會話會有一個隨著時間演變的狀態:
- 已連線:會話已被建立並可用
- 閒置:會話在至少一段時間 (這段時間是可配的) 內沒有處理任何請求
寫閒置:在一段時間內沒有任何寫操作
同時閒置:在一段時間內既沒有讀操作也沒有寫操作
- 關閉中:會話正在關閉中 (還有正在清空的訊息,清理尚未結束)
- 已關閉:會話現在已被關閉,沒有其他方法可以將其恢復。
配置
對於特定會話可以設定以下不同的引數:
- 接收緩衝大小
- 傳送緩衝大小
- 空閒時間
- 寫超時時間
管理使用者定義的屬性
有可能需要儲存一些以後可能會用到的資料。這個使用每個會話關聯到的專用資料結構來實現。這是一個鍵值對組合,它可以儲存開發人員可能希望儲存的任何型別的資料。
例如,如果你想跟蹤會話建立以後使用者已傳送的請求次數,把它放進集合很容易:只需要建立將要關聯到這個值的鍵即可。
... int counterValue = session.getAttribute( "counter" ); session.setAttribute( "counter", counterValue + 1 ); ...
這樣就有了將儲存屬性放進會話的方法:屬性就是一個鍵值對,它可以從會話的容器中新增、刪除以及讀取。
容器在會話建立時會被自動建立,而在會話結束時會被清理。
定義容器
如上所述,容器是儲存鍵值對的容器,預設情況下是一個 Map,但是也可以定義做其他的資料結構,如果你想處理長壽命週期的資料,或者避免將所有大資料都儲存在記憶體:我們可以實現一個介面和一個工廠用於在會話建立時建立容器。
以下程式碼演示了會話初始化時容器的建立:
protected final void initSession(IoSession session, IoFuture future, IoSessionInitializer sessionInitializer) { ... try { ((AbstractIoSession) session).setAttributeMap(session.getService() .getSessionDataStructureFactory().getAttributeMap(session)); } catch (IoSessionInitializationException e) { throw e; } catch (Exception e) { throw new IoSessionInitializationException( "Failed to initialize an attributeMap.", e); } ...
如果我們想要定義其他型別的容器,這裡是我們可以實現的工廠介面:
public interface IoSessionDataStructureFactory {
/**
* Returns an {@link IoSessionAttributeMap} which is going to be associated
* with the specified <tt>session</tt>. Please note that the returned
* implementation must be thread-safe.
*/
IoSessionAttributeMap getAttributeMap(IoSession session) throws Exception;
}
過濾器鏈
每個會話會關聯到一個過濾器鏈,在連入一個請求或者接收/發出訊息時這個過濾器鏈將會對其處理。這些過濾器針對於每個每個單獨的會話,在多數情況下,會為所有現有會話使用同一個過濾器鏈。
但是,也可以為單個會話動態修改過濾器鏈,比如為指定的會話的過濾器鏈新增一個日誌過濾器。
統計
每個會話也會保持對會話處理結束的一些記錄的跟蹤:
- 接收或傳送的位元組數
- 接收或傳送的訊息數
- 閒置狀態
- 吞吐量
處理器
最後,並非最不重要的,每個會話會被附加到一個處理器,該處理器負責排程給你的應用的訊息。這個處理器也會通過使用會話傳送響應包,只需呼叫 write() 方法:
...
session.write( <your message> );
...
原文連結:http://mina.apache.org/mina-project/userguide/ch4-session/ch4-session.html。