我见过很多 Atmosphere 示例,包括 pub-sub。我想做一些类似 pub-sub 的事情(客户端订阅该客户端独有的 channel ;服务器定期发布到该 channel ),除了客户端也会将数据发送到服务器。客户端将发送数据以响应服务器发送的数据,在其他情况下,当客户端发生服务器需要知道的重要事情(服务器不需要确认)时。
甚至可以用 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 的方法,因此整个事情看起来不像是可以异步完成的事情。
最佳答案
只需广播一个 Callable 即可执行您的异步 XML 解析。看看这个示例:
关于java - Atmosphere/Jersey 双向对话,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8230682/