Proceso asíncrono
Puede utilizar la técnica de proceso asíncrono de JAX-RS 2.0 para procesar hebras. El proceso asíncrono está soportado en la API del cliente y en las API del servidor. Para obtener más información acerca del proceso asíncrono en las API del cliente y del servidor, consulte el Capítulo 8 de JSR 339: JAX-RS 2.0: The Java API for RESTful Web Services (la "Especificación").
Los dos ejemplos siguientes muestran el proceso asíncrono en las API del cliente y del servidor:
- Proceso asíncrono en la API del cliente:
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 } });
- Proceso asíncrono en la API del servidor:
@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"); } }
La implementación de JAX-RS 2.0 en WebSphere Application Server tradicional da soporte a EJB
y a la utilización de beans de sesión sin estado y singleton como clases de recursos raíz. Cuando se anota
un método EJB con @Asynchronous, el contenedor EJB automáticamente
asigna los recursos necesarios para esta ejecución. Por ello, en este caso de ejemplo,
no es necesario utilizar un Ejecutar para generar una respuesta asíncrona.
Por ejemplo,
@Stateless
@Path("/")
class EJBResource {
@GET @Asynchronous
public void longRunningOp(@Suspended AsyncResponse ar) {
executeLongRunningOp();
ar.resume("Hello async world!");
}
}
La gestión de hebras explícita no es necesaria en este caso porque está bajo control
del contenedor EJB. La respuesta se genera mediante la reanudación de la llamada en
AsyncResponse incluido. Así pues, el tipo de retorno de
longRunningOp es void.