Traitement asynchrone
Vous pouvez utiliser la technique de traitement asynchrone dans JAX-RS 2.0 pour traiter les unités d'exécution. Le traitement asynchrone est pris en charge à la fois dans l'API client et dans API serveur. Pour plus d'informations sur le traitement asynchrone dans les API Client et Server, consultez le chapitre 8 du manuel JSR 339: JAX-RS 2.0: The Java API for RESTful Web Services (la "Spécification").
Les deux exemples suivants illustrent le traitement asynchrone dans les API Client et Server :
- Traitement asynchrone dans l'API Client :
Client client = ClientBuilder.newClient(); WebTarget target = client.target("http://example.org/customers/{id}"); target.resolveTemplate("id", 123).request().async().get( new InvocationCallbackCustomer() { @Override public void completed(Customer customer) { // Do something } @Override public void failed(Throwable throwable) { // Process error } });
- Traitement asynchrone dans l'API Server :
@Path("/async") public class MyResource{ @GET public void getAsync(@Suspended final AsyncResponse asyncResponse){ CompletionCallback callBack = new CompletionCallback(){ @Override public void onComplete(Throwable throwable) { ... } }; asyncResponse.register(callBack); asyncResponse.resume("some Response"); } }
L'implémentation de JAX-RS 2.0 dans Liberty prend en charge EJB et l'utilisation
de beans de session sans état et singleton en tant que classes de
ressources racines. Lorsqu'une méthode EJB est annotée avec @Asynchronous, le conteneur EJB
alloue automatiquement les ressources nécessaires pour son
exécution. Ainsi, dans ce scénario, il est inutile d'utiliser
un programme d'exécution pour générer une réponse asynchrone. Exemple :
@Stateless
@Path("/")
class EJBResource {
@GET @Asynchronous
public void longRunningOp(@Suspended AsyncResponse ar) {
executeLongRunningOp();
ar.resume("Hello async world!");
}
}
La gestion des unités d'exécution explicite n'est pas nécessaire
dans ce cas car cela est sous le contrôle du conteneur d'EJB. La réponse
est générée par la reprise d'appel sur l'élément AsyncResponse injecté. Par
conséquent, le type de retour longRunningOp est nul.