如何使用Atmosphere设计推送通知

16

我希望使用 Atmosphere 来开发一个通知系统。

我对 Atmosphere 还非常陌生,如果我有任何错误请见谅。 我的理解是当一个 Actor 发布了一些内容时,我会将通知动作保存到数据库中。 但我不明白接收者如何实时接收这些通知。

我知道发送方会做以下操作:

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

现在我无法弄清接收者如何接收此消息。

例如,我想将一个用户对象添加为朋友。当用户1添加用户2时,用户1进行广播,但是如何将通知推送给用户2呢?我难以理解这一点。

技术上,我希望有类似于Facebook或Gmail通知的东西,在用户活动时其他用户会收到通知。


你可以使用Atmosphere的BroadcasterFactory。http://jfarcand.wordpress.com/2010/06/18/trick-of-the-friday-1-delivering-server-side-events-to-your-websocketcomet-application/ - dev
1个回答

26
基本上,您需要在Atmosphere上实现发布-订阅
Atmosphere由两部分组成:客户端(基于JavaScript)和服务器端(基于Java)。
首先,您需要配置服务器端:安装 Atmosphere
也就是说,它需要添加AtmosphereResourceHttpServletRequest中。 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. 服务器接收请求,暂停并保存连接(在您的代码或广播器中)。
  3. 当发生某些事件时,服务器查找暂停的连接并向其发送通知。
  4. 客户端接收通知并调用回调函数。
  5. 利润!!!
此wiki解释了Atmosphere背后的一些概念,并提供了指向其他文档的链接。

通知功能运作良好,但会在每隔一分钟的固定间隔中重复。可能的原因是什么? - Vishnu G S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接