La aplicación cliente puede utilizar WSRMSequenceManager, que forma parte del SPI de WebSphere Application Server para una mensajería fiable, para obtener el control programado a través de secuencias de mensajería fiables. Esto ayuda a gestionar los recursos del servidor,
por ejemplo eliminando las secuencias una vez que la aplicación de
cliente ha finalizado con la mensajería. Puede añadir código para
crear secuencias, enviar solicitudes de reconocimiento, cerrar
secuencias, finalizar secuencias y esperar a que las secuencias se
hayan completado.
Antes de empezar
La interfaz SPI de WebSphere Application Server para una mensajería fiable siempre utiliza la configuración del conjunto de políticas estáticas que se aplica al cliente desde el que se invoca la interfaz SPI. No utiliza ningún conjunto de políticas alternativo que esté configurado posteriormente por WS-Policy para cumplir los requisitos de una intersección WS-Policy.
Acerca de esta tarea
Al cerrar secuencias mediante programación, limita el número de secuencias abiertas a las que tiene que dar soporte un único cliente en una JVM a la vez.
Para que la aplicación de cliente obtenga el control programado de las secuencias de mensajería fiable, debe acceder a una instancia WSRMSequenceManager. Utilice el fragmento de código siguiente para conseguir esto:
import com.ibm.wsspi.wsrm.WSRMSequenceManager;
import com.ibm.wsspi.wsrm.WSRMSequenceManagerFactory;
.........
// Obtener la fábrica
WSRMSequenceManagerFactory factory = WSRMSequenceManagerFactory
.getInstance();
// Obtener la instancia del gestor de secuencias
WSRMSequenceManager sequenceManager = factory.createWSRMSequenceManager();
Todos los métodos
WSRMSequenceManager adoptan los siguientes parámetros:
- El objeto de instancia del cliente. Puede ser una instancia del cliente Dispatch o el cliente de proxy dinámico.
Para ver detalles de los tipos de clientes, consulte el tema Modelo de programación del cliente JAX-WS.
- La instancia Port QName del punto final de destino.
Para controlar las secuencias de WS-ReliableMessaging a través de programa, añada código a la aplicación cliente, tal como se describe en los pasos siguientes:
Procedimiento
- Añada código para crear una secuencia.
Para establecer las propiedades disponibles, utilice los métodos siguientes:
/**
* Establece el punto final del proveedor de servicios.
* Un valor nulo genera una NullPointerException cuando se utiliza el objeto WSRMSequenceProperties.
*
* @param providerEndPoint El URI del punto final de servicio de destino
*/
public void setTargetEndpointUri(String providerEndPoint);
/**
* Se utiliza para indicar que se requiere un flujo de respuesta entre el proveedor y el solicitante y el flujo
* flujo de respuesta se establecerá durante la creación de la secuencia
*
* Si se invoca este método, se indica que se requiere un flujo de respuesta.
*/
public void setUseOfferedSequenceId();
/**
* Establece la versión SOAP para los mensajes de protocolo RM.
* el valor predeterminado de esta propiedad es WSRMSequenceProperties.SOAP_11
*
* @param soapVersion
*/
public void setSoapVersion(int soapVersion);
/**
* Si se han de devolver mensajes de reconocimento de secuencia de forma asíncrona, invoque este método.
*
*/
public void useAsyncTransport();
Para crear la secuencia de mensajería fiable, utilice el método createNewWSRMSequence en WSRMSequenceManager:
/**
* Inicia un nuevo protocolo de enlace de secuencia entre este cliente y el EPR de destino especificado en la
* instancia de WSRMSequenceProperties.
*
* Esta secuencia sólo será válida para el cliente si se emite la llamada createNewWSRMSequence.
*
* En la devolución de esta llamada, no se garantiza que se haya establecido la secuencia.
*
* @throws NullPointerException si el objeto sequenceProperties es nulo o si el EPR de destino es nulo
*
* @param clientObject La instancia JAX-WS o la instancia del cliente del proxy dinámico.
* @param sequencePropeties Las propiedades para crear la secuencia de mensajería fiable
* @throws WSRMNotEnabledException
* @throws WSRMSequenceAlreadyExistsException
*/
public void createNewWSRMSequence(Object clientObject, QName portQName, WSRMSequenceProperties sequencePropeties)
throws WSRMNotEnabledException,
WSRMSequenceAlreadyExistsException;
- Añada código para enviar un acuse de recibo.
Para enviar una secuencia WS-ReliableMessaging, utilice el método siguiente en
WSRMSequenceManager:
/**
* Al enviar una solicitud de reconocimiento se envía el mensaje ACK solicitado al endPointUri de destino especificado.
* El destino responderá con diferentes mensajes que se puede reconocer para la secuencia de mensajería fiable
* actual.
*
* @param clientObject La instancia JAX-WS o la instancia del cliente del proxy dinámico.
* @param portQName
* @param endPointUri El URI del punto final de destino
* @throws WSRMNotEnabledException
* @throws WSRMSequenceUnknownException
* @throws WSRMSequenceTerminatedException
* @throws WSRMSequenceClosedException
*/
public void sendAcknowledgementRequest(Object clientObject, QName portQName, String endPointUri)
throws WSRMNotEnabledException,
WSRMSequenceUnknownException,
WSRMSequenceTerminatedException,
WSRMSequenceClosedException;
- Añada código para cerrar una secuencia.
Para cerrar una secuencia WS-ReliableMessaging, utilice el siguiente método en WSRMSequenceManager:
/**
* Cierra la sesión de mensajería fiable de servicios web desde esta aplicación hasta el
* URL de punto final especificado.
*
* Genera una WSRMSequenceTerminatedException si ya se ha cerrado la sesión entre esta aplicación
* y el URL del punto final de destino.
*
* Genera una WSRMSequenceTerminatedException cuando ya ha finalizado la sesión entre esta aplicación
* y el punto final de destino.
*
* Genera una excepción WSRMSequenceUnknownException cuando la mensajería fiable no está enlazada con el URL del
* punto final especificado o cuando anteriormente se ha finalizado y suprimido la secuencia.
*
* @param clientObject La instancia JAX-WS o la instancia del cliente del proxy dinámico.
* @param endPointUri El URL de punto final de destino
*
* @throws WSRMNotEnabledException
* @throws WSRMSequenceUnknownException
* @throws WSRMSequenceClosedException
* @throws WSRMSequenceTerminatedException
*/
public void closeSequence(Object clientObject, QName portQName, String endPointUri)
throws WSRMNotEnabledException,
WSRMSequenceUnknownException,
WSRMSequenceClosedException,
WSRMSequenceTerminatedException;
- Añada código para terminar una secuencia.
Para finalizar una secuencia WS-ReliableMessaging, utilice el método siguiente en WSRMSequenceManager:
/**
* Finaliza la sesión de mensajería fiable de servicios web desde esta aplicación hasta el
* URL de punto final especificado.
*
* Genera una WSRMSequenceTerminatedException cuando ya ha finalizado la sesión entre esta aplicación
* y el punto final de destino.
*
* Genera una excepción WSRMSequenceUnknownException cuando la mensajería fiable no está enlazada con el URL del
* punto final especificado o cuando anteriormente se ha finalizado y suprimido la secuencia.
*
* @param clientObject La instancia JAX-WS o la instancia del cliente del proxy dinámico.
* @param endPointUri El URL de punto final de destino
* @throws WSRMNotEnabledException
*
* @throws WSRMSequenceTerminatedException
* @throws WSRMSequenceUnknownException
*/
public void terminateSequence(Object clientObject, QName portQName, String endPointUri) throws WSRMNotEnabledException;
- Añada código para esperar que se complete una secuencia.
Para esperar a que finalice una secuencia de mensajería fiable, utilice una llamada al método que se asegura de que todos los mensajes han sido enviados y reconocidos por el servicio de destino. Una vez finalizada la secuencia, se finaliza y se borra.
Hay dos modos de utilizar el método waitUntilSequenceCompleted:
public boolean waitUntilSequenceCompleted(Object clientObject,
QName portQName, String endPointUri, long waitTime)
Esta llamada a método espera a que transcurra el waitTime de la secuencia de mensajería fiable. Si la secuencia no se completa en el tiempo especificado, el método devuelve false. Si la secuencia se completa en este período de tiempo, el método devuelve true.
public boolean waitUntilSequenceCompleted(Object clientObject,
QName portQName, String endPointUri)
Esta llamada a método no genera una devolución hasta que se completa la secuencia de mensajería fiable.