在JavaEE中管理陈旧的Web套接字会话

时间:2016-02-12 04:09:00

标签: java-ee websocket

我正在开发一个JavaEE Web套接字项目,用于与android mobile建立Web套接字连接。 在我的项目中,我需要记住服务器端连接客户端的Web套接字会话。

如果移动客户端手动断开连接,他的会话将从我的会话映射中删除,所以没有问题,但如果Web套接字连接被取消但是输出wifi比服务器没有收到套接字关闭请求,因此会有陈旧我的会话映射中的Web套接字会话。 我的问题是如何知道我的会话地图中的会话是否在这些情况下是否有效。

我试过的是我尝试使用会话映射中的会话对象来ping客户端,但它总是向我发送pong消息,或者客户端是否处于活动状态。帮助我提出好的建议。

1 个答案:

答案 0 :(得分: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会话关联。