Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Find websocket session by id in Java EE 7

I've read Java EE documentation and for me is unclear one thing. According to API, the only way to find another Session is a code like this: (assuming that we've identifier of other 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;
}

But when we've thousands of users, this code is a performance bottleneck.

So, is there a way to get Session by id fast without using own ConcurrentHashMap for this? Or maybe some application server has undocummented feature for this (for me Wildfly would be great)?

like image 993
Ihromant Avatar asked Oct 20 '22 22:10

Ihromant


1 Answers

You can do something like:

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());
    }
}
like image 195
Arun Gupta Avatar answered Oct 22 '22 13:10

Arun Gupta