【问题标题】:Find websocket session by id in Java EE 7在 Java EE 7 中按 id 查找 websocket 会话
【发布时间】:2015-01-18 04:40:15
【问题描述】:

我已阅读 Java EE 文档,但对我来说还不清楚一件事。根据API,找到另一个会话的唯一方法是这样的代码:(假设我们有其他会话的标识符):

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;
}

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

那么,有没有办法在不使用自己的 ConcurrentHashMap 的情况下通过 id 快速获取 Session?或者也许某些应用程序服务器对此具有未记录的功能(对我来说 Wildfly 会很棒)?

【问题讨论】:

  • 您找到解决方案了吗?我正在使用 hazelcast.Imap,它不能存储 websocket.Session 对象。我需要所有 Session 对象来广播所有会话。
  • 很遗憾没有,目前我将所有会话存储在 ConcurrentHashMap 中
  • 我们针对集群环境的解决方案是使用 hazelcast 主题让所有集群知道发生了事件,并在地图中广播他们存储的会话。

标签: java performance jakarta-ee websocket java-ee-7


【解决方案1】:

你可以这样做:

Map<String, Session> map = new HashMap<>();
static Map<String, Session> peers = Collections.synchronizedMap(map);

@OnOpen
public void onOpen(Session session) {
   peers.add(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 的类似代码。我要求另一种解决方案。此外,当我们有 2 个应用程序服务器运行时,此代码将失败。
  • @Ihromant 对于分布式系统你可以使用分布式缓存或信息存储系统,这可能会有所帮助stackoverflow.com/questions/27815056/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-19
  • 2019-02-20
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多