2016-02-12 23 views
1

我正在開發一個JavaEE Web套接字項目,用於與android移動設備建立web套接字連接。 在我的項目中,我需要記住服務器端連接的客戶端的web套接字會話。在JavaEE中管理陳舊的Web套接字會話

如果手動客戶端手動斷開連接,他的會話將從我的會話映射中刪除,所以沒有問題,但是如果web套接字連接被取消但是發出的wifi比服務器沒有收到套接字關閉請求,因此會有在會話映射中陳舊的網絡套接字會話。 我的問題是如何知道會話圖中的會話是否處於活動狀態,在這種情況下。

我試過的是我嘗試從會話映射中使用會話對象ping客戶端,但它始終向我發送pong消息,或者不是客戶端處於活動狀態。用好的建議幫助我。

+1

如果您的移動應用程序需要連接,那麼你聽HttpSessionListener。在30分鐘內(httpsession的超時),如果客戶端沒有發生任何活動,httpsession將被銷燬。那時你可以從緩存中刪除你的websocket。希望它有幫助 –

回答

0

你可以聽會話銷燬。

假設你有一個CDI @SessionScoped管理bean,使用@PreDestroy

@SessionScoped 
public class SocketManager implements Serializable { 

    // ... 

    @PreDestroy 
    public void sessionDestroyed() { 
     // Close web sockets here. 
    } 

} 

或者,如果您手上沒有CDI,請使用HttpSessionListener#sessionDestroyed()

@WebListener 
public class SocketManager implements HttpSessionListener { 

    // ... 

    @Override 
    public void sessionDestroyed(HttpSessionEvent event) { 
     // Close web sockets here. 
    } 

} 

也就是說,在HTTP會話中存儲不可串行化的web套接字會話是一個壞主意。而是將它們存儲在應用程序範圍中,並由一些唯一標識符進行標識,然後再與HTTP會話進行關聯。

+0

當客戶端進行web套接字連接時是否創建Http會話? –

+0

不,它不會在WS會話啓動時創建。它僅在HTTP會話啓動時創建。通常,在客戶端會話期間首次打開JSP/Facelets頁面。 – BalusC