web-dev-qa-db-fra.com

Des services Web RESTful asynchrones sont-ils possibles?

En lisant RESTful documentation, il ne semble pas possible de mettre en oeuvre une instance asynchrone, mais quelqu'un peut en savoir plus sur le SO.

Ce que je veux dire ici, c'est que je voudrais exécuter des demandes de service de manière asynchrone:

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

Je sais que asyncSupported n'est pas défini dans @Path, mais je cherche quelque chose de similaire à @WebServlet. Ensuite, je voudrais utiliser des instances AsyncContext (ou quelque chose d'équivalent).

Est-ce possible?

17
Jérôme Verstrynge

RestEasy a un support1 pour cela - en utilisant une annotation personnalisée appelée @Suspend.

Voir ici: http://docs.jboss.org/resteasy/docs/2.2.1.GA/userguide/html/Asynchronous_HTTP_Request_Processing.html

Il existe également un cadre/une bibliothèque au-dessus de Jersey appelé Atmosphere, mais cela risque d’être excessif pour votre cas d’utilisation car son objectif semble être les applications Web client/serveur à longue interrogation (par exemple, les chats - https://github.com/ Atmosphère/atmosphère )

[1] L'étendue CDI de votre demande sera perdue dans le thread qui exécute réellement la logique. Voir le numéro RESTEasy-682 pour plus d'informations. Il s'agit d'un problème qui n'a été résolu par aucun des frameworks [REST] que je connais en ce moment.[Mars 2014].

8
Eike D

La spesification reposante en est encore à ses débuts. Mais ce problème doit être considéré comme une partie. Client et serveur.

Client:

Du côté des clients, les récents changements survenus l’année dernière sont devenus suffisamment matures. Et récemment, un client non bloquant basé sur Jeanfrancois Arcand a été implémenté et poussé dans le référentiel. Il y a une explication ici .

Serveur:

Pour le serveur, il est encore immature. L'adoption de la nouvelle spécification de servlet est assez lente et, en tant que développeur, je m'attends à ce que JSR 339 règle également ces problèmes. Et ceci est également clairement abordé dans les spécifications de la JSR avec ces phrases.

JAX-RS 1.1 définit un modèle de réponse à une demande synchrone côté serveur. Cette JSR spécifie un modèle de traitement de requête asynchrone simple permettant de renvoyer une réponse asynchrone à la requête. Servlet 3.0 peut être exploité pour permettre cette prise en charge, mais les implémentations peuvent choisir d'utiliser plutôt d'autres API spécifiques à un conteneur.

Cependant, il existe aussi d'autres alternatives. Des projets tels que Jetty traitent de ce type de problèmes aussi élégants que dans cet exemple exemple . Je ne peux que vous suggérer d’envisager d’autres solutions à mesure que la communauté grandit.

2
Cemo

C'est apparemment possible avec CXF et Jetty Continuations mais cela ne semble être possible qu'avec Jetty 6; ils ont été modifiés dans Jetty 7 pour quelque chose qui est dans les spécifications Servlet 3.0 et je ne sais pas si cela est pris en charge par CXF. De plus, Jetty Continuations semble être un peu de une API complexe, avec beaucoup de choses manuelles }, donc je ne sais pas à quel point il est facile de convertir le code.

Pourtant, un peu possible semble-t-il. Avec une brise suivante et quand Dieu le veut.

2
Donal Fellows

Vous pouvez désormais passer des appels RESTful asynchoronous à l’aide de l’API JAX-RS 2.0, qui fait partie de la récente version de Java EE 7.0.

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

2
V.Vidyasagar

Découvrez Pubsubhubbub trouvé ici pour un exemple de protocole asynchrone basé sur REST. Il est basé sur le format de syndication Atom et est beaucoup plus simple que les mécanismes WS- * pub/sub.

1
Shawn H

Vous pouvez également essayer Spring Webflux , qui est asynchrone et réactif en même temps. Cependant, il ne s'agit pas d'une implémentation JAX-RS de Java EE.

0
Piotr Gwiazda