Ответ 1
В основном вам нужно реализовать Publish-subscribe поверх Atmosphere.
Атмосфера состоит из двух частей: клиентская (javascript-based) и серверная (на основе Java).
Прежде всего вам необходимо настроить серверную часть: установка атмосферы
А именно сервлет или фильтр, требуется, чтобы он мог добавить AtmosphereResource в HttpServletRequest.
AtmosphereResource представляет собой одно клиентское соединение на стороне сервера.
Broadcaster на самом деле является контейнером для этих ресурсов, поэтому вам не нужно обрабатывать поиск/итерацию/параллелизм, когда вам нужно отправить несколько соединений. (Обратите внимание, что несколько соединений могут быть созданы одним клиентом).
На стороне сервера вам необходимо предоставить клиентам конечную точку для подписки на уведомления. Например, если вы используете Spring-MVC, это может выглядеть так (исключая проверки/аутентификации и т.д.):
@RequestMapping(value = "/user-notifications/{userId}")
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public void watch(@PathVariable("userId") String userId,
HttpServletRequest request) throws Exception {
//Atmosphere framework puts filter/servlet that adds ATMOSPHERE_RESOURCE to all requests
AtmosphereResource resource = (AtmosphereResource)request.getAttribute(ApplicationConfig.ATMOSPHERE_RESOURCE);
//suspending resource to keep connection
resource.suspend();
//find broadcaster, second parameter says to create broadcaster if it doesn't exist
Broadcaster broadcaster = BroadcasterFactory.getDefault().lookup(userId,true);
//saving resource for notifications
broadcaster.addAtmosphereResource(resource);
}
Когда что-то происходит, вы можете оповестить таких клиентов:
public void notify(User user, Event event){
Broadcaster b = BroadcasterFactory.getDefault().lookup(user.getId());
if (b!=null){
b.broadcast(event);
}
}
На стороне клиента вам необходимо отправить запрос на подписку и прослушать последующие события, например:
var request = new atmosphere.AtmosphereRequest();
request.url = '/user-notifications/'+userId;
request.transport = 'websocket';
request.fallbackTransport = 'streaming';
request.contentType = 'application/json';
request.reconnectInterval = 60000;
request.maxReconnectOnClose = 1000;
request.onMessage = function(response){
console.log(response);
alert('something happend<br>'+response);
};
that.watcherSocket = atmosphere.subscribe(request);
Итак, подведем итог:
- Клиент отправляет запрос "Я хочу получать такие уведомления".
- Сервер получает запрос, приостанавливает и сохраняет соединение где-нибудь (либо в вашем коде, либо в Broadcaster).
- Когда что-то происходит, сервер ищет приостановленное соединение и отправляет в него уведомление.
- Клиент получает уведомление и обратный вызов.
- Прибыль !!!
Эта вики имеет объяснения некоторых концепций за атмосферой и ссылки на другую документацию.