【问题标题】:Are asynchronous RESTful web services possible?异步 RESTful Web 服务是否可行?
【发布时间】:2011-09-28 12:59:28
【问题描述】:

阅读RESTful 文档,似乎不可能实现异步实例,但有人可能更了解SO。

我的意思是我想异步执行服务请求:

@Path("/helloworld", asyncSupported=true)
public class MyHelloWorldService {
    ...
}

我知道asyncSupported 没有在@Path 中定义,但我正在寻找类似于@WebServlet 的东西。然后,我想使用 AsyncContext 实例(或任何等价物)。

这可能吗?

【问题讨论】:

  • 为什么不使用 AJAX 来异步调用你的 RESTful 方法?
  • @The 因为实现了 AsyncContext 是为了解决 Servlet 中每个请求线程过多的问题。使用 Ajax 调用 RESTful 不会解决这个问题(在服务器端)。想法/解决方案是将请求排队以在有限的线程集上进行处理(有点像 Nginx)。
  • 您可能想在java.net/projects/jersey/lists/users/archive 列表中提问。 IIRC Jersey 前段时间曾尝试过期货。不确定这是否进化了。
  • 您可能希望从 Apache ServiceMix 中获得灵感。
  • 您是在问这在您的库中是否可行,或者一般如何解决 REST 接口中的异步问题?

标签: java web-services rest asynchronous jax-rs


【解决方案1】:

RestEasy 有一些支持1 - 使用名为 @Suspend 的自定义注解。

请看这里: http://docs.jboss.org/resteasy/docs/2.2.1.GA/userguide/html/Asynchronous_HTTP_Request_Processing.html

在 Jersey 之上还有一个名为 Atmosphere 的框架/库,但是这对于您的用例来说可能有点过头了,因为它的重点似乎是长轮询客户端/服务器 Web 应用程序(例如聊天 - https://github.com/Atmosphere/atmosphere

[1] 请求的 CDI 范围将丢失在实际执行逻辑的线程中。有关更多信息,请参阅RESTEasy-682 问题。这是我目前知道的任何 REST 框架都没有解决的问题[2014 年 3 月]

【讨论】:

    【解决方案2】:

    CXF and Jetty Continuations 显然有可能,但似乎只有 Jetty 6 才有可能;它们已在 Jetty 7 中更改为 Servlet 3.0 规范中的内容,我不知道 CXF 是否支持。而且Jetty Continuations好像有点a messy API, with a lot of manual stuff所以不知道转换代码有多么容易。

    不过,看起来还是有可能的。随风随风,随上帝旨意。

    【讨论】:

      【解决方案3】:

      宁静的规范化仍处于其生命的早期阶段。但是这个问题应该被认为是2部分。客户端和服务器。

      客户:

      对于客户端来说,去年最近的变化已经足够成熟了。最近实现了一个基于Jeanfrancois Arcand 的非阻塞客户端并将其推送到存储库。有解释here

      服务器:

      对于服务器端来说,还很不成熟。新 servlet 规范的采用非常缓慢,作为开发人员,我希望 JSR 339 也能解决这些问题。这在 JSR 规范中也用这些句子清楚地解决了。

      JAX-RS 1.1 定义了服务器上的同步请求响应模型 边。这个 JSR 将指定一个简单的异步请求处理 模型使得响应可以异步返回 要求。可以利用 Servlet 3.0 来启用这种支持,但是 实现可以选择使用其他特定于容器的 API 而是。

      但是也有其他选择。诸如 Jetty 之类的项目正在解决此类问题,就像 example 中的优雅问题。随着社区的发展,我只能建议您考虑其他替代方案。

      【讨论】:

        【解决方案4】:

        现在您可以使用 JAX-RS 2.0 API 进行异步 RESTful 调用,它是最近发布的 Java EE 7.0 的一部分

        http://www.slideshare.net/reza_rahman/jaxrs2?ref=

        【讨论】:

          【解决方案5】:

          查看找到的 Pubsubhubbub here 以获取基于 REST 的异步协议的示例。它基于 Atom Syndication 格式,比 WS-* pub/sub 机制简单得多。

          【讨论】:

          • 这是一个 Ruby 解决方案,你有 Java 解决方案吗?
          • 当我提到异步时,我指的是服务器端的异步请求处理......
          【解决方案6】:

          您可能还想尝试同时具有异步和反应性的 Spring Webflux。但是,这不是 Java EE 的 JAX-RS 实现。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-12-27
            • 2019-02-24
            • 2011-06-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多