2

我看过许多 Atmosphere 示例,包括 pub-sub。我想做一些类似 pub-sub 的事情(客户端订阅该客户端唯一的频道;服务器定期发布到该频道),除了客户端也会向服务器发送数据。客户端将发送数据以响应服务器发送的数据,并且在其他情况下,当客户端发生服务器需要知道的重要事件(服务器不需要确认)时。

甚至可以用 Atmosphere 做到这一点吗?

它可能看起来像这样:

@Stateless
@Path("/id/{clientId}/key/{clientKey}")
public class MyService {
    @POST
    @Produces("application/xml")
    @Consumes("application/xml")
    @Suspend
    public StreamingOutput subscribe(@PathParam("clientId") String clientId,
                                     @PathParam("clientKey") String clientKey,
                                     @Context Broadcaster broadcaster,
                                     InputStream body) {
        if (!authenticate(clientId, clientKey) {
            throw new WebApplicationException(401);
        }
        broadcaster.setID(clientId);

        // Do something here... Not sure what
    }
}

但是这里有几个问题:

  1. 传入的连接将暂停,因此它无法向服务器发送任何内容,除非通过广播恢复;
  2. 任何使用InputStream都会导致阻塞 I/O,这违背了使用 Atmosphere 的目的。

这两个问题都可以通过删除来解决@Suspend,但是我处于每个连接线程的情况。

我觉得 Atmosphere 在这里不是合适的技术,也许我可能需要做一些更低级别的事情。但我不知道该怎么做。想法?

编辑:

无论如何,我找不到一种直接的异步解析 XML 的方法,所以整个事情看起来不像可以异步完成的事情。

4

1 回答 1

2

只需广播一个 Callable 来执行您的异步 XML 解析。看看这个样本:

推特订阅

于 2011-11-24T15:22:03.973 回答