2011-09-28 77 views
17

阅读RESTful文档,它似乎不可能实现一个异步实例,但有人可能会更好地了解SO。是否可以使用异步RESTful Web服务?

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

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

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

这可能吗?

+1

为什么不使用AJAX异步调用REST风格的方法? –

+0

@The由于实现了AsyncContext来解决Servlet中过多的每线程请求问题。使用Ajax调用RESTful不会解决这个问题(在服务器端)。这个想法/解决方案是在一组有限的线程上排队处理请求(有点像Nginx)。 – JVerstry

+0

你可能想问一下http://java.net/projects/jersey/lists/users/archive列​​表。泽西岛泽西队前段时间对未来进行了实验。不知道这是否演变。 –

回答

8

RestEasy对它有一些支持 - 使用一个名为@Suspend的自定义注释。

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

还有泽西顶部的框架/库调用气氛然而作为其重点似乎是在长轮询客户机/服务器的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是否支持它。此外,码头继续似乎有点a messy API, with a lot of manual stuff,所以我不知道它是多么容易转换代码。

尽管如此,似乎有点可能。随着微风,当上帝愿意它。

+0

(不,我从来没有尝试过。) –

2

稳定的分化还处于其生命的早期阶段。但是这个问题应该被视为2部分。客户端和服务器。

客户端:

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

服务器:

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

JAX-RS 1.1在服务器端 一侧定义了同步请求响应模型。此JSR将指定一个简单的异步请求处理 模型,以便响应可以异步返回到 请求。 Servlet 3。0可以用来启用这种支持,但 实现可以选择使用其他容器特定的API 代替。

但也有其他的选择。像Jetty这样的项目正在解决像example这样优雅的问题。我只能建议你考虑其他的选择,因为社区正在成长。

1

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

+0

这是一个Ruby解决方案,你有Java吗? – JVerstry

+0

当我提到异步时,我的意思是服务器端的异步请求处理... – JVerstry

0

你也可以试试春天Webflux是异步和反应同一时间。但是,这不是Java EE中的JAX-RS实现。