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.

Supported configurations Supported configurations: Cuando ejecuta la herramienta wsimport y habilita la invocación asíncrona mediante el uso de la declaración de enlace enableAsyncMapping de JAX-WS, asegúrese de que el mensaje de respuesta correspondiente al archivo WSDL no contiene partes. Cuando un mensaje de respuesta no contiene partes, la solicitud actúa como una solicitud bidireccional, pero la respuesta real que se devuelve está vacía. La herramienta wsimport no controla correctamente una respuesta void. Para impedir esta situación, puede eliminar el mensaje de salida de la operación que convierte su operación en unidireccional o puede añadir un elemento <wsdl:part> al mensaje. Para obtener más información sobre el uso, la sintaxis y los parámetros de la herramienta wsimport, consulte la documentación del mandato wsimport para aplicaciones JAX-WS. sptcfg

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.
Avoid trouble Avoid trouble: La ubicación del escucha asíncrono se envía al servidor, de modo que el servicio puede responder al cliente. En los sistemas operativos Windows, el nombre del host local se utiliza de manera predeterminada, ya que es compatible con DHCP (Dynamic Host Configuration Protocol). No obstante, si el servidor no puede resolver el nombre de host, la aplicación de cliente no recibe las respuestas del servicio de destino. Por ejemplo, una aplicación de cliente se aloja en la estación de trabajo myhost.bar.com. En la siguiente cabecera de mensaje SOAP, la aplicación de cliente envía el nombre abreviado myhost como los detalles del host. A menos que el servidor de destino no resuelva myhost en myhost.bar.com, las respuesta siguientes no llegarán a la aplicación cliente:
  <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
gotcha

Procedimiento

  1. Decida si desea implementar el retorno de llamada o el método de sondeo para que el cliente invoque de forma asíncrona el servicio web.
  2. (Opcional) Configure el contexto de solicitud de cliente. Añada la propiedad
    com.ibm.websphere.webservices.use.async.mep
    al contexto de la solicitud para habilitar la mensajería asíncrona para el cliente de servicios web. El uso de esta propiedad requiere que el punto final de servicio soporte WS-Addressing que está soportado, de manera predeterminada, para el servidor de aplicaciones. En el ejemplo siguiente se muestra cómo establecer esta propiedad:
    Map<String, Object> rc = ((BindingProvider) port).getRequestContext();
     rc.put("com.ibm.websphere.webservices.use.async.mep", Boolean.TRUE);
  3. Para implementar el método de retorno de llamada asíncrono, realice los pasos siguientes:
    1. Encuentre el método de retorno de llamada asíncrono en la SEI o en la interfaz javax.xml.ws.Dispatch. Para una SEI, el nombre de método acaba en Async y tiene uno o más parámetros que el método asíncrono del tipo javax.xml.ws.AsyncHandler. El método invokeAsync(Object, AsyncHandler) es el utilizado en la interfaz Dispatch.
    2. (Opcional) Añada los métodos service.setExecutor a la aplicación cliente. Si añade los métodos de ejecutor otorga al cliente el control de los métodos de planificación para el proceso de la respuesta. También puede utilizar la fábrica de clases java.current.Executors para obtener ejecutores empaquetados o implementar sus propias clases de ejecutor. Consulte la especificación de JAX-WS si desea más información sobre el uso de los métodos de la clase de ejecutor con el cliente.
    3. Implemente la interfaz javax.xml.ws.AsyncHandler. La interfaz javax.xml.ws.AsyncHandler sólo tiene el método handleResponse(javax.xml.ws.Response). El método debe contener la lógica del proceso de la respuesta o de una posible excepción. Se llama al método después de que el tiempo de ejecución del cliente haya recibido y procesado la respuesta asíncrona del servidor.
    4. Invoque al método asíncrono de retorno de llamada con los datos de parámetros y el manejador del retorno de llamada.
    5. El método handleResponse(Response) se invoca en el objeto de retorno de llamada cuando la respuesta está disponible. Se llama al método Response.get() dentro de este método para entregar la respuesta.
  4. Para implementar el método de sondeo,
    1. Encuentre el método asíncrono de sondeo en la SEI o en la interfaz javax.xml.ws.Dispatch. Para una SEI, el nombre del método acaba en Async y tiene un tipo de devolución de javax.xml.ws.Response. Se utiliza el método invokeAsync(Object) en la interfaz Dispatch.
    2. Invoque el método de sondeo asíncrono con los datos del parámetro.
    3. El cliente recibe el tipo de objeto, javax.xml.ws.Response, que se utiliza para supervisar el estado de la solicitud en el servidor. El método isDone() indica si la invocación se ha completado. Cuando el método isDone() devuelve un valor de true, llame al método get() para recuperar el objeto de la respuesta.
  5. Utilice el método cancel() para el método de retorno de llamada o el de sondeo, si el cliente necesita dejar de esperar una respuesta procedente del servicio. Si el cliente invoca el método cancel(), el punto final sigue procesando la solicitud. Sin embargo, se detiene el proceso de espera y respuesta para el cliente.

Resultados

Ha habilitado el cliente de servicio web JAX-WS para invocar y consumir servicios web de forma asíncrona. Consulte la especificación JAX-WS para obtener información adicional relacionada con las API de cliente asíncrono.

Ejemplo

En el ejemplo siguiente, se muestra una interfaz de servicio web con métodos para solicitudes asíncronas procedentes del cliente.
@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();

Icon that indicates the type of topic Task topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_jaxwsclientasync
File name: twbs_jaxwsclientasync.html