WSIFOperation: consulta de interacciones asíncronas
WSIF (Web Services Invocation Framework) da soporte a operaciones asíncronas. En esta modalidad de operación, el cliente transfiere el mensaje de solicitud como parte de una transacción y lleva a cabo la hebra de ejecución. El mensaje de respuesta lo manejan después una hebra diferente con una transacción diferente.
Las operaciones asíncronas están soportadas por los proveedores de WSIF para SOAP en JMS y JMS nativo.
La clase WSIFPort utiliza el método supportsAsync para comprobar si se da soporte a las operaciones asíncronas.
Una operación asíncrona se inicia con el método executeRequestResponseAsync de la interfaz WSIFOperation. Este método permite invocar de forma asíncrona un método de llamada de procedimiento remoto (RPC). El método vuelve antes de que se complete la operación y la hebra de ejecución continúa.
La respuesta a la solicitud asíncrona la procesan los métodos fireAsyncResponse o processAsyncResponse de la interfaz WSIFOperation.
public WSIFCorrelationId executeRequestResponseAsync (WSIFMessage input, WSIFResponseHandler handler)
public WSIFCorrelationId executeRequestResponseAsync (WSIFMessage input)
- executeRequestResponseAsync(WSIFMessage input, WSIFResponseHandler handler)
Este método toma un mensaje de entrada y un manejador WSIFResponseHandler. El manejador se invoca en otra hebra cuando finaliza la operación. Cuando se utiliza este método, la escucha del cliente llama al método fireAsyncResponse, que a su vez llama al método executeAsyncResponse de la interfaz WSIFResponseHandler.
- executeRequestResponseAsync(WSIFMessage input)
- Este método sólo toma un mensaje de entrada, y no utiliza el manejador de respuestas. La escucha del cliente procesa la respuesta llamando al método processAsyncResponse de la interfaz WSIFOperation. Este proceso actualiza la salida de WSIFMessage y los mensajes de anomalía con el resultado de la solicitud.
WSIF da soporte a la correlación entre la solicitud asíncrona y la respuesta. Cuando se envía la solicitud, se serializa el objeto WSIFOperation en el objeto WSIFCorrelationService. Los métodos executeRequestResponseAsync devuelven un objeto WSIFCorrelationId que identifica el objeto WSIFOperation serializado. La escucha del cliente puede utilizarlo para hacer correlacionar una respuesta con una solicitud determinada.
El servicio de correlación se encuentra con el método getCorrelationService() de la clase WSIFCorrelationServiceLocator en el paquete org.apache.wsif.utils.
En un contenedor gestionado se define un servicio de correlación predeterminado en el espacio de nombres JNDI (Java™ Naming and Directory Interface) predeterminado utilizando el nombre: java:comp/wsif/WSIFCorrelationService. Si no está disponible este servicio de correlación, WSIF utiliza WSIFDefaultCorrelationService.
Para obtener más información sobre la interfaz WSIFCorrelationService, consulte la documentación de API generada que se proporciona con WSIF.
Este es el ID de correlacionador:
public interface WSIFCorrelator extends Serializable {
public String getCorrelationId();
}
El cliente debe implementar su propia escucha de mensajes de respuesta o base de datos de mensajes para reconocer la llegada de los mensajes de respuesta. Esta implementación de cliente gestiona la correlación del mensaje de respuesta con la solicitud y la llamada de uno de los métodos de proceso de respuesta asíncrona. A modo de ejemplo del requisito de un escucha cliente, en el fragmento de código siguiente se muestra lo que puede haber en el método onMessage de un escucha JMS (Java Message Service):
public void onMessage(Message msg) {
WSIFCorrelationService cs = WSIFCorrelationServiceLocator.getCorrelationService();
WSIFCorrelationId cid = new JmsCorrelationId( msg.getJMSCorrelationID() );
WSIFOperation op = cs.get( cid );
op.fireAsyncResponse( msg );
}