我看过许多 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
}
}
但是这里有几个问题:
- 传入的连接将暂停,因此它无法向服务器发送任何内容,除非通过广播恢复;
- 任何使用
InputStream
都会导致阻塞 I/O,这违背了使用 Atmosphere 的目的。
这两个问题都可以通过删除来解决@Suspend
,但是我处于每个连接线程的情况。
我觉得 Atmosphere 在这里不是合适的技术,也许我可能需要做一些更低级别的事情。但我不知道该怎么做。想法?
编辑:
无论如何,我找不到一种直接的异步解析 XML 的方法,所以整个事情看起来不像可以异步完成的事情。