java - Atmosphere/Jersey 双向对话

标签 java jersey jax-rs atmosphere

我见过很多 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
    }
}

但是这里有几个问题:

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

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

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

编辑:

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

最佳答案

只需广播一个 Callable 即可执行您的异步 XML 解析。看看这个示例:

TwitterFeed

关于java - Atmosphere/Jersey 双向对话,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8230682/

相关文章:

java - BLE 入门 -> NullPointerException

java - 相同的 Java 字体在 Eclipse 与 JNLP 中略有不同

java - 将 Json 传递给 Rest 并通过 JSONObject 接收

rest - 什么是最好的 JAX-RS 库?

java - 需要一些关于简短 Java 代码的帮助/建议

使用 jaxb api 的 java 类在带有 : Provider com. sun.xml.bind.v2.ContextFactory 的 jira 中未找到

java - 解压缩 GZIP http-response(使用 jersey client api,java)

java - 构建在 Spring 3 (m3) 上的 REST-fully 注释服务的最小配置是什么?

java - 带有 Response 参数的方法中的 IllegalStateException

java - Jackson json 提供程序 linkedHashSet 反序列化