我已经看到了很多大气示例,包括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
来解决,但是我处于每个连接线程的情况。
我感觉到氛围在这里将不再是合适的技术,也许我可能不得不做些低级的工作。但是我不确定该怎么做。想法?
编辑:
无论如何,我都找不到一种简单的异步解析XML的简单方法,因此,整个过程看起来不太像可以异步完成的事情。
只需广播一个Callable即可执行异步XML解析。看一下这个示例: