在Java EE 7中按ID查找WebSocket会话

Ihr*_*ant 5 java performance java-ee websocket java-ee-7

我已经阅读了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;
}
Run Code Online (Sandbox Code Playgroud)

但是,当我们有成千上万的用户时,此代码是性能瓶颈。

因此,有没有一种方法可以快速通过id获得Session,而无需为此使用自己的ConcurrentHashMap?也许某些应用服务器对此具有未保留的功能(对我来说Wildfly会很棒)?

Aru*_*pta 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());
    }
}
Run Code Online (Sandbox Code Playgroud)