大气 - 简单的案例场景 - 后备传输不起作用

时间:2013-04-27 17:01:31

标签: atmosphere

我想使用Atmosphere(1.0.12)创建prototpe,但我目前的实施例不适用于后备传输。

简单案例场景:
1.客户端连接到服务器 - 服务器将当前(完整)状态推送到该客户端
2.服务器将当前状态的更改推送到所有连接的客户端

我认为这是一种非常常见的情况。

我是如何为websockets做的:

  1. 当客户端连接(GET)时,我将资源添加到默认广播器。此广播器用于向所有客户端发送数据(更改)。在同一方法中,我为此资源创建了另一个广播公司:
     Broadcaster privateBroadcaster = broadcasterFactory.lookup(DefaultBroadcaster.class,resource.uuid(),true);

  2. 客户端将数据推送到服务器。调用POST方法。这意味着:我是一个客户,我想要当前的完整状态。因此服务器获取原始资源UUID,查找privateBroadcaster,privateBroadcaster用于将完整状态推送到该客户端。

  3. 服务器使用默认的boradcaster将数据推送到所有客户端。除非客户再次想要完全状态,否则不使用privateBroacaster。
  4. 问题:
    如果浏览器不支持websockets(即IE9,IE 8),则此解决方案不适用于后备传输。 此解决方案不起作用,因为POST方法中的原始资源与当前资源相同。因此,无法获得私人广播公司并将完整状态发送给客户。

    问题:

    1. 我的解决方案是否有机会进行一些修改?如果是这样,我应该改变什么 如果不是
    2. 如何为这种情况制定解决方案?
    3. 我承认我现在迷路了,需要一些帮助。如果您需要更多细节,请询问。 提前谢谢。

      - 更新
      我决定将部分代码负责创建私有广播公司的POST方法。该方法如下所示。负责创建响应的部分是无关紧要的,因此是隐藏的。这仍适用于webscokets,不适用于后备(长轮询)协议。客户端未收到初始状态,收到更改,但无需更新。

      @Context AtmosphereResource resource;
      @Context BroadcasterFactory broadcasterFactory;
      
      @POST
      @Produces(MediaType.APPLICATION_JSON)
      @Consumes(MediaType.APPLICATION_JSON)
      public void sendCurrentState(Request request){
      
          logger.info("creating private broadcaster for uuid: " + resource.uuid());
          Broadcaster privateBroadcaster = broadcasterFactory.lookup(DefaultBroadcaster.class, resource.uuid(), true);
          privateBroadcaster.addAtmosphereResource(resource);
          //Prepare response (hidden)
          privateBroadcaster.broadcast(encodedJSON);
      }
      

      休伯特

1 个答案:

答案 0 :(得分:0)

萨吕,

POST中的AtmosphereResource不一样。对于长轮询和流式传输,uuid是相同的,但是您需要使用AtmosphereResourceFactory.find(...)来检索暂停的AtmosphereResource。

如果它不起作用,让我们继续讨论邮件列表。

A +

  • jeanfrancois