O aplicativo cliente pode usar WSRMSequenceManager, parte do SPI
do WebSphere Application Server para sistema de mensagens confiável, para obter controle
programático sobre sequencias do sistema de mensagens confiável. Isso ajuda a gerenciar recursos no servidor, por exemplo, removendo
sequencias após um aplicativo cliente ter concluído as mensagens. É possível incluir
código para criar sequencias, enviar pedidos de confirmação, bem como fechar, encerrar e
aguardar a conclusão de sequencias.
Antes de Iniciar
O SPI do WebSphere Application Server para sistema de mensagens confiável sempre
utiliza a configuração do conjunto de política estática que é aplicada ao cliente de onde o SPI é
chamado. Ele não utiliza nenhum conjunto de política alternativo que seja configurado subsequentemente
pela WS-Policy para atender aos requisitos de uma interseção da WS-Policy.
Sobre Esta Tarefa
Ao fechar a sequência de forma
programática, você limita o número de sequências abertas que um único cliente precisa suportar em uma única
JVM de cada vez.
Para que seu aplicativo cliente assuma o controle programático sobre
sequencias do sistema de mensagens confiáveis, ele precisa de acesso a uma instância
WSRMSequenceManager. Utilize o seguinte fragmento de código para executar isso:
import com.ibm.wsspi.wsrm.WSRMSequenceManager;
import com.ibm.wsspi.wsrm.WSRMSequenceManagerFactory;
.........
// Obter o factory
WSRMSequenceManagerFactory factory = WSRMSequenceManagerFactory
.getInstance();
// Obter a instância do gerenciador de sequência
WSRMSequenceManager sequenceManager = factory.createWSRMSequenceManager();
Todos
os métodos
WSRMSequenceManager assumem os seguintes parâmetros:
- O objeto da instância do cliente.
É uma instância do Cliente Dispatch
ou o Cliente de Proxy Dinâmico.
Para obter detalhes sobre os tipos de clientes, consulte o tópico Modelo de programação de cliente JAX-WS.
- A instância QName de Porta para o terminal de destino.
Para controlar as sequências WS-ReliableMessaging
programaticamente, inclua o código em seu aplicativo cliente conforme descrito
nas seguintes etapas:
Procedimento
- Inclua o código para criar uma sequência.
Para configurar as propriedades disponíveis, utilize os seguintes métodos:
/**
* Configura o terminal do provedor de destino.
* Um valor null resultará em NullPointerException quando o objeto WSRMSequenceProperties for utilizado.
*
* @param providerEndPoint O URI de terminal do serviço de destino
*/
public void setTargetEndpointUri(String providerEndPoint);
/**
* É utilizado para indicar que um fluxo de resposta é necessário entre o provedor e o solicitante e que o fluxo de
* resposta será estabelecido no momento de criação da sequência
*
* Ao chamar esse método, ele indicará que um fluxo de resposta é necessário.
*/
public void setUseOfferedSequenceId();
/**
* Configurar a versão Soap para as mensagens de protocolo RM.
* O valor padrão para essa propriedade é WSRMSequenceProperties.SOAP_11
*
* @param soapVersion
*/
public void setSoapVersion(int soapVersion);
/**
* Se as mensagens de Confirmação de Sequência precisarem ser enviadas novamente de forma assíncrona, chame esse método.
*
*/
public void useAsyncTransport();
Para criar a sequência do sistema de mensagens confiável, utilize o método createNewWSRMSequence no WSRMSequenceManager:
/**
* Inicia um novo handshake de sequência entre esse cliente e o EPR de destino especificado na
* instância WSRMSequenceProperties.
*
* Essa instância será válida somente para o cliente que emite a chamada createNewWSRMSequence.
*
* Ao retornar dessa chamada, não há garantia de que a sequência foi estabelecida.
*
* @throws NullPointerException se o objeto sequenceProperties for null ou o EPR de destino for null
*
* @param clientObject A instância Dispatch de JAX-WS ou a instância de cliente Dynamic Proxy.
* @param sequencePropeties As propriedades para criar a sequência do sistema de mensagens confiável
* @throws WSRMNotEnabledException
* @throws WSRMSequenceAlreadyExistsException
*/
public void createNewWSRMSequence(Object clientObject, QName portQName, WSRMSequenceProperties sequencePropeties)
throws WSRMNotEnabledException,
WSRMSequenceAlreadyExistsException;
- Inclua o código para enviar uma solicitação de reconhecimento.
Para enviar uma solicitação de reconhecimento para uma sequência do
WS-ReliableMessaging, use o seguinte método no WSRMSequenceManager:
/**
* O envio de um pedido de confirmação envia a mensagem solicitada de ACK ao endPointUri de destino especificado.
* O destino responderá com um intervalo de mensagens que podem ser confirmadas para a sequência atual do sistema de mensagens
* confiável.
*
* @param clientObject A instância Dispatch de JAX-WS ou a instância de cliente Dynamic Proxy.
* @param portQName
* @param endPointUri O uri de terminal de destino
* @throws WSRMNotEnabledException
* @throws WSRMSequenceUnknownException
* @throws WSRMSequenceTerminatedException
* @throws WSRMSequenceClosedException
*/
public void sendAcknowledgementRequest(Object clientObject, QName portQName, String endPointUri)
throws WSRMNotEnabledException,
WSRMSequenceUnknownException,
WSRMSequenceTerminatedException,
WSRMSequenceClosedException;
- Inclua o código para fechar uma sequência.
Para fechar uma sequência WS-ReliableMessaging, utilize o método a seguir no WSRMSequenceManager:
/**
* Fecha a sessão do sistema de mensagens confiável de serviços da Web a partir desse aplicativo para
* a url do terminal especificada.
*
* Ativará uma WSRMSequenceTerminatedException se a sessão entre esse aplicativo e
* a url de terminal de destino já estiver fechada
*
* Ativa uma WSRMSequenceTerminatedException quando a sessão entre esse aplicativo e
* o terminal de destino já foi terminado.
*
* Ativa a exceção WSRMSequenceUnknownException quando um dos sistemas de mensagens confiáveis não está associado à
* url do terminal especificado ou a sequência foi anteriormente terminada e removida.
*
* @param clientObject A instância Dispatch de JAX-WS ou a instância de cliente Dynamic Proxy.
* @param endPointUri A url do terminal de destino
*
* @throws WSRMNotEnabledException
* @throws WSRMSequenceUnknownException
* @throws WSRMSequenceClosedException
* @throws WSRMSequenceTerminatedException
*/
public void closeSequence(Object clientObject, QName portQName, String endPointUri)
throws WSRMNotEnabledException,
WSRMSequenceUnknownException,
WSRMSequenceClosedException,
WSRMSequenceTerminatedException;
- Inclua o código para terminar uma sequência.
Para finalizar uma sequência do
WS-ReliableMessaging, utilize o seguinte método no WSRMSequenceManager:
/**
* Termina a sessão do sistema de mensagens confiável de serviços da Web a partir desse aplicativo para
* a url do terminal especificada.
*
* Ativa uma WSRMSequenceTerminatedException quando a sessão entre esse aplicativo e
* o terminal de destino já foi terminado.
*
* Ativa a exceção WSRMSequenceUnknownException quando um dos sistemas de mensagens confiáveis não está associado à
* url do terminal especificado ou a sequência foi anteriormente terminada e removida.
*
* @param clientObject A instância Dispatch de JAX-WS ou a instância de cliente Dynamic Proxy.
* @param endPointUri A url do terminal de destino
* @throws WSRMNotEnabledException
*
* @throws WSRMSequenceTerminatedException
* @throws WSRMSequenceUnknownException
*/
public void terminateSequence(Object clientObject, QName portQName, String endPointUri) throws WSRMNotEnabledException;
- Inclua o código para aguardar até que uma sequência seja concluída.
Para aguardar a conclusão de uma sequência do sistema de mensagens confiável, utilize uma chamada de método que garanta que todas as mensagens tenham sido enviadas e confirmadas pelo serviço de destino. Após a conclusão da sequência, ela é terminada e limpa.
Há duas maneiras de utilizar o método waitUntilSequenceCompleted:
public boolean waitUntilSequenceCompleted(Object clientObject,
QName portQName, String endPointUri, long waitTime)
Essa chamada de método aguarda o waitTime especificado para a sequência do sistema de mensagens confiável ser concluída. Se a sequência não for concluída no tempo especificado, o método retornará false. Caso contrário, o método retornará true.
public boolean waitUntilSequenceCompleted(Object clientObject,
QName portQName, String endPointUri)
Essa chamada de método não retorna até a sequência do sistema de mensagens confiável ser concluída.