2011-09-28 19 views
17

Al leer la documentación de RESTful, no parece que sea posible implementar una instancia asincrónica, pero alguien puede saber mejor en SO.¿Son posibles los servicios web RESTful asíncronos?

Lo que quiero decir es me gustaría cumplimiento a las solicitudes de servicio de forma asíncrona:

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

asyncSupported no está definido en @Path, pero estoy buscando algo similar a @WebServlet. Entonces, me gustaría usar las instancias AsyncContext (o cualquier cosa equivalente).

¿Esto es posible?

+1

¿Por qué no utilizar AJAX para llamar a su método RESTful de forma asíncrona? –

+0

@The porque AsyncContext se implementó para resolver el problema de exceso de hilos por solicitud en Servlet. Usar Ajax para llamar a RESTful no resolvería este problema (en el lado del servidor). La idea/solución es poner en cola solicitudes para procesar en un conjunto limitado de hilos (un poco como Nginx). – JVerstry

+0

Es posible que desee preguntar en la lista http://java.net/projects/jersey/lists/users/archive. IIRC Jersey experimentó con futuros hace algún tiempo. No estoy seguro de si eso evolucionó. –

Respuesta

8

RestEasy tiene un poco de soporte para ello - utilizando una anotación personalizada llamada @Suspend.

Ver aquí: http://docs.jboss.org/resteasy/docs/2.2.1.GA/userguide/html/Asynchronous_HTTP_Request_Processing.html

También hay un marco/biblioteca en la parte superior de Jersey llamada Atmósfera sin embargo, que podría ser excesiva para el caso de uso como su foco parece estar en las aplicaciones web de cliente/servidor de votación larga (por ejemplo, chats - https://github.com/Atmosphere/atmosphere)

[1] El alcance del CDI para su solicitud se perderá en el hilo que realmente ejecuta la lógica. Consulte el problema RESTEasy-682 para obtener más información. Este es un problema que no ha sido resuelto por ningún marco REST que yo sepa en este momento [marzo de 2014].

2

Aparentemente es posible con CXF and Jetty Continuations pero eso solo parece posible con Jetty 6; Han cambiado en Jetty 7 a algo que está en la especificación de Servlet 3.0 y no sé si es compatible con CXF. Además, Jetta Continuations parece ser un poco de a messy API, with a lot of manual stuff, así que no sé cuán fácil es convertir el código.

Todavía, algo posible parece. Con la siguiente brisa y cuando Dios lo quiera.

+0

(Y no, nunca lo he probado) –

2

La especificación relajante todavía está en las primeras edades de su vida. Pero este problema debe considerarse como 2 partes. Cliente y servidor.

Cliente:

Para los recientes cambios en el lado del cliente en el año pasado se convirtió en lo suficientemente maduro. Y recientemente se implementó un cliente sin bloqueo basado en Jeanfrancois Arcand y se envió al repositorio. Hay una explicación here.

Servidor:

Por el lado del servidor, todavía es inmaduro. La adopción de la nueva especificación de servlet es bastante lenta y, como desarrollador, espero JSR 339 para abordar estos problemas también. Y esto también se aborda en la especificación JSR claramente con estas oraciones.

JAX-RS 1.1 define un modelo de respuesta de solicitud síncrona en el lado del servidor . Este JSR especificará un modelo de solicitud asíncrona simple que procesa el modelo de modo que una respuesta se pueda devolver de forma asíncrona a la solicitud . Servlet 3.Se puede aprovechar 0 para habilitar dicho soporte, pero las implementaciones pueden optar por utilizar otras API específicas del contenedor .

Sin embargo, hay otras alternativas también. Proyectos como Jetty se están dirigiendo a este tipo de problemas elegantes como en este example. Solo puedo sugerirle que considere otras alternativas a medida que la comunidad crece.

1

Echa un vistazo a Pubsubhubbub encontró here para un ejemplo de un protocolo asincrónico basado en REST. Se basa en el formato de sindicación Atom y es mucho más simple que WS- * pub/sub mecanismos.

+0

Esa es una solución de Ruby, ¿tiene la de Java? – JVerstry

+0

Cuando me refiero a asincrónico, me refiero a procesamiento de solicitud asíncrona en el servidor ... – JVerstry

0

También es posible que desee probar la primavera Webflux que es asíncrona y reactiva en al mismo tiempo. Sin embargo, esta no es una implementación JAX-RS de Java EE.

Cuestiones relacionadas