Well, I figured out how this can be achieved using the Atmosphere environment. Firstly, I upgraded SNAPSHOT to 0.7, but I think the same logic will work with 0.6.
So, to create a broadcaster for one user:
In GET request
// Use one Broadcaster per AtmosphereResource try { atmoResource.setBroadcaster(BroadcasterFactory.getDefault().get()); } catch (Throwable t) { throw new IOException(t); } // Create a Broadcaster based on this session id. selfBroadcaster = atmoResource.getBroadcaster(); // add to the selfBroadcaster selfBroadcaster.addAtmosphereResource(atmoResource); atmoResource.suspend();
When the login action is called,
//Get this broadcaster from session and add it to BroadcasterFactory. Broadcaster selfBroadcaster = (Broadcaster) session.getAttribute(sessionId); BroadcasterFactory.getDefault().add(selfBroadcaster, name); Now the global broadcaster. The logic here is, you create a broadcaster from the first resource and then add each resource as they log in. Broadcaster globalBroadcaster; globalBroadcaster = BroadcasterFactory.getDefault().lookup(DefaultBroadcaster.class, GLOBAL_TOKEN, false); if (globalBroadcaster == null) { globalBroadcaster = selfBroadcaster; } else { BroadcasterFactory.getDefault().remove( globalBroadcaster, GLOBAL_TOKEN); AtmosphereResource r = (AtmosphereResource) session .getAttribute("atmoResource"); globalBroadcaster.addAtmosphereResource(r); } BroadcasterFactory.getDefault().add(globalBroadcaster, GLOBAL_TOKEN);
Finally, you can stream to one connection or globally to all connections as follows:
// Single Connection/Session Broadcaster singleBroadcaster= BroadcasterFactory.getDefault().lookup( DefaultBroadcaster.class, name); singleBroadcaster.broadcast("Only for you"); // Global Broadcaster globalBroadcaster = BroadcasterFactory.getDefault().lookup(DefaultBroadcaster.class,GLOBAL_TOKEN, false); globalBroadcaster.broadcast("Global message to all");
To send a message to a partner, simply find the transmitter for the partner and do the same as above for one connection.
Hope this helps someone who is trying to achieve the same. There may be better ways to do this. I think I will have to use this approach until someone offers a better solution.