How to design push notifications using Atmosphere

我怕爱的太早我们不能终老 提交于 2019-12-02 16:24:19
elusive-code

Basically what you need is to implement Publish-subscribe on top of Atmosphere.

Atmosphere consists of two parts: client-side (javascript-based) and server-side(java-based).

First of all you need to configure server-side: Installing Atmosphere

Namely servlet or filter, it is required so that it could add AtmosphereResource to the HttpServletRequest.

AtmosphereResource represents a single client connection on the server-side.

Broadcaster is actually a container for these resources, so that you don't need to handle lookup/iteration/concurrency when you need to send to multiple connections. (Note that multiple connections can be produced by single client).

On the server-side you need to provide clients an endpoint to subscribe for notifications. For example, if you are using Spring-MVC, it could go like this (omitting validations/authentications, etc.):

@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);
}

When something happens you can notify clients like this:

public void notify(User user, Event event){
    Broadcaster b = BroadcasterFactory.getDefault().lookup(user.getId());
    if (b!=null){
        b.broadcast(event);
    }
}

On the client side you need to send a subscribe request and listen for subsequent events, like this:

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);

So, to sum it up:

  1. Client sends request "I want to receive this kind of notifications".
  2. Server receives request, suspends and saves connection somewhere (either in your code or in Broadcaster).
  3. When something happens server looks for suspended connection and sends notification in it.
  4. Client receives notification and callback is invoked.
  5. Profit!!!

This wiki has explanations for some concepts behind Atmosphere and links to other documentation.

Atmosphere supports WebSocket. If you want to write a java client you may want to try https://github.com/TooTallNate/Java-WebSocket

See section Writing your own WebSocket Client

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!