Usei JAXWS-RI 2.1 para criar uma interface para meu serviço da web, com base em um WSDL. Posso interagir com o serviço da web sem problemas, mas não consegui especificar um tempo limite para enviar solicitações ao serviço da web. Se por algum motivo ele não responder, o cliente parece apenas girar suas rodas para sempre.
Procurar por aí revelou que provavelmente eu deveria tentar fazer algo assim:
((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.ws.request.timeout", 10000);
((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.ws.connect.timeout", 10000);
Também descobri que, dependendo de qual versão do JAXWS-RI você possui, pode ser necessário definir estas propriedades:
((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.internal.ws.request.timeout", 10000);
((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.internal.ws.connect.timeout", 10000);
O problema que tenho é que, independentemente de qual das opções acima seja a correta, não sei onde posso fazer isso. Tudo o que tenho é uma Service
subclasse que implementa a interface gerada automaticamente para o serviço da web e no ponto em que isso está sendo instanciado, se o WSDL não responder, então já é tarde demais para definir as propriedades:
MyWebServiceSoap soap;
MyWebService service = new MyWebService("http://www.google.com");
soap = service.getMyWebServiceSoap();
soap.sendRequestToMyWebService();
Alguém pode me apontar na direção certa?!
Respostas:
Eu sei que isso é antigo e respondido em outro lugar, mas espero que isso encerre isso. Não sei por que você deseja baixar o WSDL dinamicamente, mas as propriedades do sistema:
deve se aplicar a todas as leituras e conexões usando HttpURLConnection que JAX-WS usa. Isso deve resolver seu problema se você estiver obtendo o WSDL de um local remoto - mas um arquivo em seu disco local provavelmente é melhor!
Em seguida, se você deseja definir tempos limite para serviços específicos, depois de criar seu proxy, você precisa convertê-lo em um BindingProvider (que você já conhece), obtenha o contexto da solicitação e defina suas propriedades. A documentação JAX-WS online está errada, esses são os nomes de propriedade corretos (bem, eles funcionam para mim).
Claro, essa é uma maneira horrível de fazer as coisas, eu criaria uma boa fábrica para produzir esses provedores de ligação que podem ser injetados com os tempos limite que você deseja.
fonte
As propriedades na resposta aceita não funcionaram para mim, possivelmente porque estou usando a implementação JBoss do JAX-WS?
Usar um conjunto diferente de propriedades (encontrado no Guia do Usuário JBoss JAX-WS ) fez com que funcionasse:
fonte
Aqui está minha solução de trabalho:
fonte
Isso funcionou para mim.
fonte
Se você estiver usando JAX-WS no JDK6, use as seguintes propriedades:
fonte
com.sun.xml.internal.ws.connect.timeout
vscom.sun.xml.ws.connect.timeout
) e também a classe (ou interface) que as define (com.sun.xml.internal.ws.developer.JAXWSProperties
/com.sun.xml.internal.ws.client.BindingProviderProperties
vscom.sun.xml.ws.developer.JAXWSProperties
/com.sun.xml.ws.client.BindingProviderProperties
). Minha melhor ideia é definir ambos, usando valores literais como chaves.Caso o seu appserver seja WebLogic (para mim era 10.3.6), as propriedades responsáveis pelos tempos limite são:
fonte
Não tenho certeza se isso vai ajudar no seu contexto ...
O objeto de sabão pode ser lançado como um BindingProvider?
Por outro lado, se você deseja definir o tempo limite na inicialização do objeto MyWebService, isso não ajudará.
Isso funcionou para mim quando queria atingir o tempo limite das chamadas de WebService individuais.
fonte
a maneira mais fácil de evitar a recuperação lenta do WSDL remoto ao instanciar seu SEI é não recuperar o WSDL do terminal de serviço remoto no tempo de execução.
isso significa que você deve atualizar sua cópia WSDL local sempre que o provedor de serviços fizer uma alteração impactante, mas também significa que você deve atualizar sua cópia local sempre que o provedor de serviços fizer uma mudança impactante.
Quando eu gero meus stubs de cliente, digo ao JAX-WS runtime para anotar o SEI de forma que ele leia o WSDL de um local pré-determinado no caminho de classe. por padrão, a localização é relativa à localização do pacote do SEI de serviço
o atributo wsldLocation informa ao SEI onde ele pode localizar o WSDL e a cópia garante que o wsdl (e o xsd de suporte .. etc.) esteja no local correto.
como o local é relativo ao local do pacote do SEI, criamos um novo subpacote (diretório) chamado wsdl e copiamos todos os artefatos wsdl nele.
tudo o que você precisa fazer neste ponto é certificar-se de incluir todos os * .wsdl, * .xsd além de todos os * .class ao criar seu arquivo jar de artefato stub do cliente.
(no caso de você estar curioso, a anotação @webserviceClient é onde este local wsdl é realmente definido no código java
fonte