1. 程式人生 > >《Apache MINA 2.0 使用者指南》第四章:會話

《Apache MINA 2.0 使用者指南》第四章:會話

        會話處於 MINA 的核心位置:每當一個客戶端連線到伺服器,一個新的會話會被建立,並會在客戶端關掉連線前一直儲存在記憶體中。
        會話用於儲存連線的持久資訊,以及在請求處理過程中、會話的生命週期中伺服器可能需要用到的任何資訊。
        會話的狀態
        會話會有一個隨著時間演變的狀態:
  • 已連線:會話已被建立並可用
  • 閒置:會話在至少一段時間 (這段時間是可配的) 內沒有處理任何請求
                讀閒置:在一段時間內沒有任何讀操作
                寫閒置:在一段時間內沒有任何寫操作
                同時閒置:在一段時間內既沒有讀操作也沒有寫操作
  • 關閉中:會話正在關閉中 (還有正在清空的訊息,清理尚未結束)
  • 已關閉:會話現在已被關閉,沒有其他方法可以將其恢復。
        以下狀態圖揭示了所有可能的狀態及其轉換:

session-state
        配置
        對於特定會話可以設定以下不同的引數:
  • 接收緩衝大小
  • 傳送緩衝大小
  • 空閒時間
  • 寫超時時間
        另外還有一些其他配置,取決於你所用的傳輸型別 (參考《Apache MINA 2.0 使用者指南》第六章:傳輸)。
        管理使用者定義的屬性
        有可能需要儲存一些以後可能會用到的資料。這個使用每個會話關聯到的專用資料結構來實現。這是一個鍵值對組合,它可以儲存開發人員可能希望儲存的任何型別的資料。
        例如,如果你想跟蹤會話建立以後使用者已傳送的請求次數,把它放進集合很容易:只需要建立將要關聯到這個值的鍵即可。
...
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