我见过许多 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 在这里不适合使用技术,也许我可能需要做一些级别较低的事情。但我不知道该怎么做。有想法吗?
Edit:
无论如何,我找不到异步解析 XML 的直接方法,因此整个事情看起来不太像可以异步完成的事情。
只需广播 Callable 即可执行异步 XML 解析。看看这个示例:
推特动态
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)