Как создавать push-уведомления с использованием Atmosphere

Я хочу использовать атмосферу для разработки системы уведомлений.

Я очень новичок в Атмосфере, так что извиняюсь, если я где-то ошибаюсь. Я понял, что когда актер публикует что-то, я сохраняю действие уведомления в базе данных. Я не понимаю, как получатель получит эти уведомления в реальном времени.

Отправитель, которого я знаю, сделает что-то вроде следующего

event.getBroadcaster().broadcast(
            objectMapper.writeValueAsString("Some Message"));

Теперь я не могу понять, как получатель может получить это сообщение.

Например. Я хочу добавить пользовательский объект в качестве друга. Поэтому, когда User1 добавляет трансляцию User2 User1, а не как я нажимаю уведомление на User2. Мне трудно понять это.

Технически я хочу что-то подобное, например, facebook или gmail-уведомление, где при активности пользователя другие пользователи получают уведомления.

Ответы

Ответ 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);

Итак, подведем итог:

  1. Клиент отправляет запрос "Я хочу получать такие уведомления".
  2. Сервер получает запрос, приостанавливает и сохраняет соединение где-нибудь (либо в вашем коде, либо в Broadcaster).
  3. Когда что-то происходит, сервер ищет приостановленное соединение и отправляет в него уведомление.
  4. Клиент получает уведомление и обратный вызов.
  5. Прибыль !!!

Эта вики имеет объяснения некоторых концепций за атмосферой и ссылки на другую документацию.

Ответ 2

Атмосфера поддерживает WebSocket. Если вы хотите написать java-клиент, вы можете попробовать https://github.com/TooTallNate/Java-WebSocket

См. Раздел Создание собственного клиента WebSocket