我在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)会不错?
答案 0 :(得分:3)
identityHashMap通常从绑定到线程的内存地址或随机数生成器派生,然后在JVM首次使用时存储在对象头中。碰撞的可能性很小,但并非不可能。
鉴于可能发生碰撞,为什么要冒风险呢?这可能导致的错误将是微妙的和刺激性的追踪。
答案 1 :(得分:1)
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);
}
}