Labs SD >
O exemplo abaixo demonstra como configurar os tempos de espera pelas respostas de Web Services. No fim do tempo, caso a resposta não tenha sido recebida, é atirada uma excepção.
O JAX-WS distingue dois timeouts distintos:
Exemplo:
Este exemplo demonstra como definir operações unidireccionais, ou seja, operações de Web Service que não enviam resposta.
Em situações em que o cliente não pretenda ficar bloqueado à espera da resposta do servidor, é possível fazê-lo através de uma invocação assíncrona.
Uma possível maneira de fazer invocações assíncronas é através dos métodos com sufixo Async. Para que estes métodos sejam gerados é necessário do lado do cliente indicar um ficheiro de binding. Os stubs assim gerados passam a incluir tanto os métodos para invocação sincrona como assíncrona.
<bindings xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://java.sun.com/xml/ns/jaxws" > <bindings node="wsdl:definitions"> <enableAsyncMapping>true</enableAsyncMapping> </bindings> </bindings>
Para uma invocação assíncrona, o cliente deve executar um método com o sufixo Async e de seguida usar o método Response.isDone() para verificar se a resposta já chegou. Nesta solução o cliente invoca o método remoto sem ficar bloqueado, ficando responsável por verificar quando o servidor já respondeu através do objecto Response. Só depois da resposta ter chegado, pode então obter o seu resultado através do objecto Response.
// asynchronous call with polling Responseresponse = port.echoAsync(name); while (!response.isDone()) { Thread.sleep(100 /* milliseconds */); /* while waiting for response do other calls... */ String result = port.fastEcho(name); System.out.print("Synchronous call result: "); System.out.println(result); } System.out.println("Async->" + response.get().getReturn());
Um outro modelo de funcionamento é o registo de um objecto de callback do tipo AsyncHandler aquando da execução da chamada assíncrona. Quando a resposta chega, um método desse objecto é invocado.
static boolean finished = false; ... // asynchronous call with callback port.echoAsync(name, new AsyncHandler() { @Override public void handleResponse(Response response) { try { System.out.println(); System.out.print("Asynchronous call result arrived: "); System.out.println(response.get().getReturn()); finished = true; } catch (InterruptedException e) { System.out.println("Caught interrupted exception."); System.out.print("Cause: "); System.out.println(e.getCause()); } catch (ExecutionException e) { System.out.println("Caught execution exception."); System.out.print("Cause: "); System.out.println(e.getCause()); } } }); while (!finished) { Thread.sleep(100); System.out.print("."); System.out.flush(); }
Em ambos os casos, a resposta é obtida invocando o método response.get() que lança uma excepção caso esta tenha sido retornada pelo método remoto. Caso o método remoto retorne Void, este método lancará uma NullPointerException. Caso contrário, o objecto retornado pode ser obtido com o método getReturn().
Repare que não é preciso alterar o servidor para que o cliente possa fazer invocações assíncronas.
© Docentes de Sistemas Distribuídos,
Dep. Eng. Informática,
Técnico Lisboa