Chamando Serviços da Web JAX-WS Assincronicamente
O Java™ API for XML-Based Web Services (JAX-WS) fornece suporte para chamar serviços da Web usando uma chamada de cliente assíncrona. O JAX-WS fornece suporte para ambos, um retorno de chamada e um modelo de pesquisa ao chamar serviços da Web assincronicamente. O modelo de retorno de chamada e o modelo de sondagem estão disponíveis no cliente Dispatch e no cliente de Proxy Dinâmico.
Antes de Iniciar
Desenvolva um cliente Dispatch ou JAX-WS Dynamic Proxy. Ao desenvolver clientes de Proxy Dinâmico, depois de gerar os artefatos do cliente portátil a partir de um arquivo WSDL (Web Services Description Language) utilizando o comando wsimport, o SEI (Service Endpoint Interface) gerado não possuirá métodos assíncronos incluídos na interface. Utilize as ligações JAX-WS para incluir métodos assíncronos de retorno de chamada ou de sondagem na na interface para o cliente de Proxy Dinâmico. Para ativar os mapeamentos assíncronos, é possível incluir a declaração de ligação jaxws:enableAsyncMapping no arquivo WSDL. Para obter informações adicionais sobre a inclusão das customizações de ligação para gerar uma interface assíncrona, consulte o capítulo 8 da especificação JAX-WS.

Sobre Esta Tarefa
Uma chamada assíncrona de um serviço da Web envia um pedido para o terminal em serviço e depois imediatamente retorna o controle para o programa cliente sem aguardar pela resposta para retornar do serviço. Os clientes de serviço da Web assíncronos JAX-WS consomem serviços da Web usando a abordagem de retorno de chamada ou a abordagem de pesquisa. Utilizando um modelo de sondagem, um cliente pode emitir um pedido e receber um objeto de resposta que é sondado para determinar se o servidor respondeu. Quando o servidor responde, a resposta real é recuperada. Utilizando o modelo de retorno de chamada, o cliente fornece um manipulador de retorno de chamada para aceitar e processar o objeto de resposta de entrada. O método handleResponse() do manipulador é chamado quando o resultado estiver disponível. Ambos os modelos, de pesquisa e de retorno de chamada, permitem ao cliente focar na continuidade para processar trabalho sem aguardar pelo retorno de uma resposta, enquanto fornece um modelo mais dinâmico e eficiente para chamar serviços da Web. As chamadas de sondagem são válidas a partir de clientes EJB (Enterprise JavaBeans) ou aplicativos clientes Java EE (Java Platform, Enterprise Edition). As chamadas de retorno de chamada são válidas apenas a partir dos clientes de aplicativos Java EE.
- Utilizando o modelo de chamada assíncrona de retorno de chamada
- Para implementar uma chamada assíncrona que usa o modelo de retorno de chamada, o cliente fornece um manipulador de retorno de chamada AsyncHandler para aceitar e processar o objeto de resposta de entrada. O manipulador de retorno de chamada do cliente implementa a interface javax.xml.ws.AsyncHandler, que contém o código do aplicativo que será executado quando uma resposta assíncrona for recebida do servidor. A interface javax.xml.ws.AsyncHandler contém o método handleResponse(javax.xml.ws.Response) que é chamado depois de o tempo de execução ter recebido e processado a resposta assíncrona do servidor. A resposta é entregue ao manipulador de retorno de chamada na forma de um objeto javax.xml.ws.Response. O objeto de resposta retorna o conteúdo de resposta quando o método get() for chamado. Além disso, se um erro for recebido, será retornada uma exceção ao cliente durante essa chamada. O método de resposta é então chamado de acordo com o modelo de encadeamento utilizado pelo método executor, java.util.concurrent.Executor na instância java.xml.ws.Service do cliente que foi utilizada para criar a instância do cliente Dispatch ou de Proxy Dinâmico. O executor é utilizado para chamar quaisquer retornos de chamada assíncronos registrados pelo aplicativo. Utilize os métodos setExecutor e getExecutor para modificar e recuperar o executor configurado para o seu serviço.
- Utilizando o modelo de chamada assíncrona da sondagem
- Utilizando o modelo de sondagem, um cliente pode emitir um pedido e receber um objeto de resposta que pode ser sondado subseqüentemente para determinar se o servidor respondeu. Quando o servidor responder, a resposta real poderá então ser recuperada. O objeto de resposta retorna o conteúdo de resposta quando o método get() for chamado. O cliente recebe um objeto do tipo javax.xml.ws.Response do método invokeAsync. O objeto de Resposta é utilizado para monitorar o status do pedido para o servidor, determinar quando a operação foi concluída e recuperar os resultados de resposta.
- Utilizando uma troca de mensagens assíncrona
- Por padrão, as chamadas de cliente assíncronas não possuem um comportamento assíncrono do padrão de troca de mensagens na ligação. O modelo de programação é assíncrono; no entanto, a troca das mensagens de pedido ou resposta com o servidor não é assíncrona. Para utilizar uma troca de mensagens assíncronas, a propriedade com.ibm.websphere.webservices.use.async.mep deve ser configurada no contexto de pedido do cliente com um valor booleano true. Quando essa propriedade for ativada, as mensagens trocadas entre o cliente e o servidor serão diferentes das mensagens trocadas de maneira síncrona. Com uma troca assíncrona, as mensagens de pedido e de resposta possuem cabeçalhos WS-Addressing incluídos que fornecem informações adicionais de roteamento para as mensagens. Outra diferença principal entre a troca de mensagem assíncrona e síncrona é que a resposta é entregue a um listener assíncrono que então entrega essa resposta de volta para o cliente. Para trocas assíncronas, não há tempo limite que seja enviado para notificar o cliente para parar de atender uma resposta. Para forçar o cliente a parar de aguardar por uma resposta, emita um método Response.cancel() no objeto retornado de uma chamada de sondagem ou um método Future.cancel() no objeto retornado de uma chamada de retorno de chamada. A resposta de cancelamento não afeta o servidor ao processar um pedido.

<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 o cliente para enviar os detalhes do local para o listener assíncrono no formato
IP, incluindo a seguinte propriedade do sistema na máquina virtual Java. Observe que transmitindo o endereço IP você perde os
benefícios do DHCP. -Dcom.ibm.websphere.webservices.transportEPRInIPAddr=yes
gotchaProcedimento
Resultados
Exemplo
@WebService
public interface CreditRatingService {
// Operação síncrona.
Score getCreditScore(Customer customer);
// Operação assíncrona com sondagem.
Response<Score> getCreditScoreAsync(Customer customer);
// Operação assíncrona com retorno de chamada.
Future<?> getQuoteAsync(Customer customer,
AsyncHandler<Score> handler);
}
- Utilizando o Método de Retorno de Chamada
- O método de retorno de chamada requer um manipulador de retorno de chamada que é mostrado no seguinte exemplo. Ao utilizar o procedimento de retorno de chamada, após um pedido ser feito, o manipulador de retorno de chamada é responsável pela manipulação da resposta. O valor de resposta é uma resposta ou possivelmente uma exceção. O método Future<?> representa o resultado de um cálculo assíncrono e é verificado para saber se o cálculo foi concluído. Quando você quiser que o aplicativo seja descoberto se o pedido estiver concluído, chame o método Future.isDone(). Observe que o método Future.get() não fornece uma resposta significativa e não é semelhante ao método Response.get().
CreditRatingService svc = ...;
Future<?> invocation = svc.getCreditScoreAsync(customerTom,
new AsyncHandler<Score>() {
public void handleResponse (
Response<Score> response)
{
score = response.get();
// processar o pedido...
}
}
);
- Utilizando o Método de Sondagem
- O seguinte exemplo ilustra um cliente de sondagem assíncrono:
CreditRatingService svc = ...;
Response<Score> response = svc.getCreditScoreAsync(customerTom);
while (!response.isDone()) {
// Faça algo enquanto aguardamos.
}
score = response.get();