Invocación asíncrona de los servicios web JAX-WS
JAX-WS (API Java™ para servicios web XML) proporciona soporte para invocar servicios web mediante una invocación de cliente asíncrona. Si se invocan los servicios web de forma asíncrona, JAX-WS ofrece soporte tanto para el modelo de retorno de llamada como para el modelo de sondeo. Ambos modelos, el de retorno de llamada y el de sondeo, están disponibles en el cliente Dispatch y en el cliente Dynamic Proxy.
Antes de empezar
Desarrolle un cliente Dynamic Proxy o Dispatch de JAX-WS. Al desarrollar clientes Dynamic Proxy, después de generar los artefactos de cliente portátiles a partir de un archivo WDSL (Web Services Description Language) mediante el mandato wsimport, la interfaz del punto final de servicio (SEI) generado no incluye los métodos asíncronos. Utilice los enlaces JAX-WS para añadir los métodos de retorno de llamada y de sondeo asíncronos en la interfaz del cliente Dynamic Proxy. Para habilitar las correlaciones asíncronas, puede añadir la declaración de enlace jaxws:enableAsyncMapping en el archivo WSDL. Si desea más información sobre cómo añadir personalizaciones de enlaces para generar una interfaz asíncrona, consulte el capítulo 8 de la especificación JAX-WS.

Acerca de esta tarea
Una invocación asíncrona de un servicio web envía una solicitud al punto final de servicio y, a continuación, devuelve inmediatamente el control al programa cliente sin esperar una respuesta del servicio. Los clientes del servicio web asíncrono JAX-WS consumen los servicios web utilizando el enfoque de retorno de llamada o el de sondeo. Si se utiliza un modelo de sondeo, un cliente puede enviar una solicitud y recibir un objeto de respuesta que se sondea para determinar si el servidor ha respondido. Cuando el servidor responde, se recupera la respuesta real. Si se utiliza el modelo de retorno de llamada, el cliente proporciona un manejador de devolución de llamada para aceptar y procesar el objeto de respuesta de entrada. Se llama al método handleResponse() del manejador cuando el resultado está disponible. Tanto los modelos de sondeo como los de devolución de llamada permiten al cliente centrarse en seguir procesando el trabajo sin esperar una respuesta, a la vez que se proporciona un modelo más dinámico y eficaz para invocar servicios web. Las invocaciones de sondeo son válidas desde clientes EJB (Enterprise JavaBeans) o clientes de aplicaciones Java EE) (Java Platform, Enterprise Edition). Las invocaciones de devolución de llamada son válidas sólo desde clientes de aplicaciones Java EE.
- Utilización del modelo de invocación asíncrona de devolución de llamada
- Para implementar una invocación asíncrona que utiliza el modelo de retorno de llamada, el cliente proporciona un manejador de devolución de llamada AsyncHandler para aceptar y procesar el objeto de respuesta de entrada. El manejador de devolución de llamada del cliente implementa la interfaz javax.xml.ws.AsyncHandler, que contiene el código de la aplicación que se ejecuta cuando se recibe una respuesta asíncrona del servidor. La interfaz javax.xml.ws.AsyncHandler contiene el método handleResponse(java.xml.ws.Response) que se invoca una vez que el tiempo de ejecución ha recibido y procesado la respuesta asíncrona del servidor. La respuesta se entrega al manejador de devolución de llamada en forma de un objeto javax.xml.ws.Response. El objeto de respuesta devuelve el contenido de la respuesta cuando se llama al método get(). De forma adicional, si se recibe un error, se devuelve una excepción al cliente durante la llamada. A continuación, se invoca el método de respuesta de acuerdo con el modelo de hebras utilizado por el método ejecutor,java.util.concurrent.Executor en la instancia java.xml.ws.Service del cliente que se utilizó para crear la instancia del cliente Dynamic Proxy o Dispatch. El ejecutor se utiliza para invocar las devoluciones de llamada asíncronas registradas por la aplicación. Utilice los métodos setExecutor y getExecutor para modificar y recuperar el ejecutor configurado para el servicio.
- Utilización del modelo de invocación asíncrona del sondeo
- Si se utiliza el modelo de sondeo, un cliente puede emitir una solicitud y recibir un objeto de respuesta que se puede sondear posteriormente para determinar si el servidor ha respondido. Cuando el servidor responde, se puede recuperar la respuesta real. El objeto de respuesta devuelve el contenido de la respuesta cuando se llama al método get(). El cliente recibe un objeto del tipo javax.xml.ws.Response desde el método invokeAsync. El objeto Response se utiliza para supervisar el estado de la solicitud en el servidor, determinar cuando se ha completado la operación y recuperar los resultados de la respuesta.
- Utilización del intercambio de mensajes asíncrono
- De forma predeterminada, las invocaciones de cliente asíncronas no tienen el comportamiento asíncrono del patrón de intercambio de mensajes en la comunicación. El modelo de programación es asíncrono; sin embargo, el intercambio de mensajes de solicitud o de respuesta con el servidor no es asíncrono. Para utilizar un intercambio de mensajes asíncrono, la propiedad com.ibm.websphere.webservices.use.async.mep debe estar establecida en el contexto de la solicitud del cliente con un valor booleano de true. Cuando está habilitada esta propiedad, los mensajes intercambiados entre el cliente y el servidor son diferentes respecto a los mensajes intercambiados de forma asíncrona. Con un intercambio asíncrono, los mensajes de solicitud y de respuesta tienen cabeceras WS-Addressing añadidas que proporcionan información adicional de direccionamiento para los mensajes. Otra diferencia principal entre el intercambio de mensajes asíncrono y el síncrono es que la respuesta se entrega a un escucha asíncrono que, a continuación, devuelve la respuesta al cliente. Para los intercambios asíncronos, no existe ningún tiempo de espera excedido que se envíe para notificar al cliente que detenga el receptor de una respuesta. Para forzar al cliente a detener la espera de una respuesta, emita un método Response.cancel() en el objeto devuelto de una invocación de sondeo o un método Future.cancel() en el objeto devuelto de una invocación de retorno de llamada. La respuesta de cancelación no afecta al servidor cuando procesa una solicitud.

<soapenv:Header>
<wsa:To>http://target.bar.com:81/LiteSecurityService/SecurityService</wsa:To>
<wsa:ReplyTo>
<wsa:Address>http://myhost:2146/axis2/services/LiteSecurityService.
WSRMServicePort/AnonOutInOp?IBMwebservicesID=922A5DC38A337C4CEF1168347862705
</wsa:Address>
</wsa:ReplyTo>
<wsa:MessageID>urn:uuid:922A5DC38A337C4CEF1168347862403</wsa:MessageID>
<wsa:Action>getEndpointReference</wsa:Action>
</soapenv:Header>
Para resolver este problema, configure el cliente de
modo que envíe los detalles de la ubicación para el escucha asíncrono en formato IP,
añadiendo la siguiente propiedad el sistema a la máquina virtual
Java. Tenga en cuenta al transmitir la dirección IP, pierde las ventajas de DHCP.
-Dcom.ibm.websphere.webservices.transportEPRInIPAddr=yes
gotchaProcedimiento
Resultados
Ejemplo
@WebService
public interface CreditRatingService {
// Operación síncrona.
Score getCreditScore(Customer customer);
// Operación asíncrona con sondeo.
Response<Score> getCreditScoreAsync(Customer customer);
// Operación asíncrona con retorno de llamada.
Future<?> getQuoteAsync(Customer customer,
AsyncHandler<Score> handler);
}
- Utilización del método de devolución de llamada
- El método de devolución de llamada requiere un manejador de devolución de llamada que se muestra en el ejemplo siguiente. Cuando se utilice el procedimiento de retorno de llamada, después de realizar una solicitud, el manejador de devolución de llamada es responsable de la gestión de la respuesta. El valor de la respuesta es una respuesta o una posible excepción. El método Future<?> representa el resultado de una computación asíncrona y se comprueba para saber si la computación se ha completado. Cuando desee que la aplicación descubra si la solicitud se ha completado, invoque el método Future.isDone(). Tenga en cuenta que el método Future.get() no proporciona una respuesta significativa y no es similar al método Response.get().
CreditRatingService svc = ...;
Future<?> invocation = svc.getCreditScoreAsync(customerTom,
new AsyncHandler<Score>() {
public void handleResponse (
Response<Score> response)
{
score = response.get();
// procesar la solicitud...
}
}
);
- Utilización del método de sondeo
- En el ejemplo siguiente se muestra un cliente de sondeo asíncrono:
CreditRatingService svc = ...;
Response<Score> response = svc.getCreditScoreAsync(customerTom);
while (!response.isDone()) {
// Realizar alguna acción mientras se espera.
}
score = response.get();