我在dropwizard服务中实现了websocket,他们需要在服务器端实现会话管理。在连接上,我们得到会话对象,这是客户端和服务器之间的通信链路。但是没有办法像session.getId()那样获取会话的唯一id,我需要id进行会话管理。
所以我一直在考虑使用System.identityHashCode(Session)来获取唯一的id并使用此ID处理会话。
仅供参考,websocket onConnect 结构是
@OnWebSocketConnect
public void onOpen(Session session) throws IOException
{
// code to add the session in session management using unique id
}
所以使用System.identityHashCode(Session)会很好吗?
identityHashMap 通常派生自内存地址或绑定到线程的随机数生成器,然后在 JVM 首次使用时存储在对象标头中。碰撞的可能性很低,但并非不可能。
鉴于可能发生碰撞,为什么要冒险呢? 这可能导致的错误将是微妙的,并且令人恼火。
WebSocketSession
是Session
的实现。它覆盖hashCode
和equals
,因此可以在使用超过 4GB 内存的程序中安全地进行哈希处理。也就是说,会话是关键。
你可以做这样的事情:
class YourClass
{
private Set<Session> managedSessions = new HashSet<Session>();
// or use a Map<Session,Data> if you want to store associated data
@OnWebSocketConnect
public void onOpen(Session session) throws IOException
{
if (managedSessions.contains(session)) {
// working with preexisting session
} else {
managedSessions.add(session);
}
}
@OnWebSocketClose
public void onClose(Session session, int statusCode, String reason)
{
managedSessions.remove(session);
}
}