在Java EE 7中如何通过id查找websocket会话

5

我已经阅读了Java EE文档,但仍有一个不太清楚的问题。根据API,唯一找到其他Session的方法是使用以下代码(假设我们已经有另一个session的标识符):

import javax.websocket.Session;
...
private static Session findOtherSessionById(Session user, String id) {
    for (Session session : user.getOpenSessions()) {
        if (id.equals(session.getId())) {
            return session;
        }
    }
    return null;
}

但是当我们有成千上万的用户时,这段代码就成为了性能瓶颈。

那么,有没有一种快速获取会话ID的方法,而不需要使用自己的ConcurrentHashMap呢?或者某些应用服务器是否有未记录的功能(对我来说Wildfly很好)?


你找到任何解决方案了吗?我正在使用Hazelcast.Imap,但它无法存储websocket.Session对象。我需要所有Session对象以广播所有会话。 - omerhakanbilici
很遗憾,目前我正在将所有会话存储在ConcurrentHashMap中。 - Ihromant
我们针对集群环境的解决方案是使用Hazelcast主题来通知所有集群有事件发生,并广播它们在映射中存储的会话。 - omerhakanbilici
1个回答

3
你可以这样做:
Map<String, Session> map = new HashMap<>();
static Map<String, Session> peers = Collections.synchronizedMap(map);

@OnOpen
public void onOpen(Session session) {
   peers.put(session.getId(), session);
}

@OnClose
public void onClose(Session session) {
    peers.remove(session.getId());
}

private static Session findOtherSessionById(Session user, String id) {
    if (peers.containsKey(user.getId()) {
        return peers.get(user.getId());
    }
}

我目前有一段类似的代码,使用了ConcurrentHashMap而不是synchronizedMap。我寻求另一种解决方案。此外,当我们有两个应用服务器在运行时,这段代码将会失败。 - Ihromant
1
@Ihromant 对于分布式系统,您可以使用分布式缓存或信息存储系统,这可能会有所帮助。https://dev59.com/TYbca4cB1Zd3GeqPYqz- - Chen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接