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.

Configurações suportadas Configurações suportadas: Ao executar a ferramenta wsimport e ativar a chamada assíncrona com o uso da declaração de ligação JAX-WS enableAsyncMapping, assegure-se de que a mensagem de resposta correspondente no arquivo WSDL não contenha partes. Quando uma mensagem de resposta não contém partes, o pedido age como um pedido bidirecional, mas a resposta real que é enviada de volta é vazia. A ferramenta wsimport não trata corretamente uma resposta vazia. Para evitar esse cenário, é possível remover a mensagem de saída da operação que torna sua operação unidirecional, ou incluir <wsdl:part> em sua mensagem. Para obter mais informações sobre o uso, a sintaxe e os parâmetros da ferramenta wsimport, consulte o comando wsimport para obter a documentação de aplicativos JAX-WS. sptcfg

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.
Evitar Problemas Evitar Problemas: O local do listener assíncrono é enviado ao servidor, de modo de que o serviço possa responder ao cliente. Nos sistemas operacionais Windows, o nome do host local é utilizado, por padrão, porque é compatível com o DHCP (Dynamic Host Configuration Protocol). No entanto, se o servidor não puder resolver o nome do host, o aplicativo cliente não receberá respostas do serviço de destino. Por exemplo, um aplicativo cliente é hospedado na estação de trabalho myhost.bar.com. No cabeçalho da mensagem SOAP a seguir, o aplicativo cliente envia o nome abreviado myhost como seus detalhes de host. A menos que o servidor de destino possa resolver myhost para myhost.bar.com, as respostas subsequentes não alcançam o aplicativo 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 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
gotcha

Procedimento

  1. Determine se deseja implementar o método de retorno de chamada ou o método de pesquisa para o cliente chamar assincronicamente o serviço da Web.
  2. (Opcional) Configure o contexto de pedido do cliente. Inclua a propriedade
    com.ibm.websphere.webservices.use.async.mep
    no contexto do pedido para possibilitar o sistema de mensagens assíncrono ao cliente dos serviços da Web. O uso dessa propriedade requer que o terminal de serviço suporte o WS-Addressing, que é suportado por padrão no servidor de aplicativos. O exemplo a seguir demonstra como configurar essa propriedade:
    Map<String, Object> rc = ((BindingProvider) port).getRequestContext();
     rc.put("com.ibm.websphere.webservices.use.async.mep", Boolean.TRUE);
  3. Para implementar o método de retorno de chamada assíncrono, execute as etapas a seguir.
    1. Localize o método de retorno de chamada assíncrono no SEI ou na interface javax.xml.ws.Dispatch. Para uma SEI, o nome do método termina com Async e tem um parâmetro a mais do que o método síncrono do tipo javax.xml.ws.AsyncHandler. O método invokeAsync(Object, AsyncHandler) é aquele utilizado na interface Dispatch.
    2. (Opcional) Inclua os métodos service.setExecutor no aplicativo cliente. A inclusão dos métodos do executor dá ao cliente controle dos métodos de planejamento para processar a resposta. Você também pode optar por utilizar o class factory java.current.Executors para obter executores compactados ou implementar sua própria classe de executor. Consulte a especificação JAX-WS para obter mais informações sobre como utilizar os métodos de classe de executor com o cliente.
    3. Implemente a interface javax.xml.ws.AsyncHandler. A interface javax.xml.ws.AsyncHandler possui apenas o método handleResponse(javax.xml.ws.Response). O método deve conter a lógica para processar a resposta ou possivelmente uma exceção. O método é chamado depois que o tempo de execução do cliente tiver recebido e processado a resposta assíncrona do servidor.
    4. Chame o método de retorno de chamada assíncrono com os dados do parâmetro e o manipulador de retorno de chamada.
    5. O método handleResponse(Response) é chamado no objeto de retorno de chamada quando a resposta estiver disponível. O método Response.get() é chamado com esse método para entregar a resposta.
  4. Para implementar o método de sondagem,
    1. Localize o método de sondagem assíncrono no SEI ou na interface javax.xml.ws.Dispatch. Para uma SEI, o nome do método termina com Async e tem um tipo de retorno javax.xml.ws.Response. O método invokeAsync(Object) é utilizado na interface Dispatch.
    2. Chame o método de sondagem assíncrona com os dados de parâmetro.
    3. O cliente recebe o tipo de objeto, javax.xml.ws.Response, que é utilizado para monitorar o status do pedido para o servidor. O método isDone() indica se a chamada foi concluída. Quando o método isDone() retornar um valor true, chame o método get() para recuperar o objeto de resposta.
  5. Utilize o método cancel() para o método de sondagem ou retorno de chamada, se o cliente precisar parar de esperar por uma resposta do serviço. Se o método cancel() for chamado pelo cliente, o terminal continuará processando o pedido. Entretanto, o processamento de espera e resposta para o cliente é parado.

Resultados

Você ativou o seu cliente de serviço da Web JAX-WS para chamar assincronicamente e consumir serviços da Web. Consulte a especificação JAX-WS para obter informações adicionais referentes às APIs do cliente assíncronas.

Exemplo

O exemplo a seguir ilustra uma interface de serviço da Web com métodos para pedidos assíncronos do cliente.
@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();

Ícone que indica o tipo de tópico Tópico de Tarefa



Ícone de registro de data e hora Última atualização: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_jaxwsclientasync
Nome do arquivo: twbs_jaxwsclientasync.html