异步RESTful网络服务是否可行?

16

阅读RESTful文档,似乎不可能实现异步实例,但是在SO上可能有人知道得更好。

我想表达的是我想要异步执行服务请求:

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

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

这种情况可能吗?


1
为什么不使用AJAX异步调用你的RESTful方法呢? - Buhake Sindi
由于AsyncContext是为了解决Servlet中过多的每个请求一个线程的问题而实现的。使用Ajax调用RESTful并不能解决这个问题(在服务器端)。解决方案的想法是将请求排队,以在有限的一组线程上进行处理(有点像Nginx)。 - Jérôme Verstrynge
你可能想在http://java.net/projects/jersey/lists/users/archive列表上提问。我记得Jersey之前尝试过使用futures,但不确定是否有进展。 - Jan Algermissen
你可能想要寻找像Apache ServiceMix这样的东西来获得灵感。 - BillMan
请查看此链接:https://spring.io/guides/gs/async-method/ - ravindrab
显示剩余4条评论
6个回答

8

RestEasy提供了一些支持,使用自定义注释@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

2
显然,使用CXF和Jetty Continuations是可能的,但这似乎只适用于Jetty 6;在Jetty 7中,它们已经被更改为符合Servlet 3.0规范的内容,我不知道CXF是否支持。此外,Jetty Continuations似乎是一个有点混乱的API,需要进行很多手动操作,因此我不知道转换代码有多容易。
尽管如此,似乎还是有一定的可能性。带着顺风并在上帝的恩典下。

2
“Restful规范仍处于早期阶段。但是这个问题应该分为两部分:客户端和服务器。”
“客户端:”
“对于客户端,最近一年的变化已经足够成熟。最近,一个基于Jeanfrancois Arcand的非阻塞客户端被实现并推送到存储库中。这里有一个解释here。”
“服务器:”
“对于服务器端,它仍然不够成熟。新servlet规范的采用速度相当缓慢,作为开发人员,我期望JSR 339也能解决这些问题。这在JSR规范中也得到了明确的解决。”
JAX-RS 1.1在服务器端定义了同步请求响应模型。该JSR将指定一个简单的异步请求处理模型,以便可以异步返回响应。Servlet 3.0可以被利用来启用这种支持,但实现可能选择使用其他特定于容器的API。

然而,还有其他选择。像Jetty这样的项目正在优雅地解决这类问题,如此示例所示。我只能建议您考虑其他选择,因为社区正在不断发展。


1

请查看此处的Pubsubhubbub示例,了解一种基于REST的异步协议。它基于Atom订阅格式,比WS-* pub/sub机制简单得多。


那是一个Ruby的解决方案,你有Java的吗? - Jérôme Verstrynge
当我提到异步时,我指的是服务器端的异步请求处理... - Jérôme Verstrynge

0

您可能还想尝试Spring Webflux,它同时是异步和响应式的。但是,请注意这不是Java EE中的JAX-RS实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接