Ich habe JAXWS-RI 2.1 verwendet, um eine Schnittstelle für meinen Webdienst basierend auf einer WSDL zu erstellen. Ich kann problemlos mit dem Webdienst interagieren, konnte jedoch kein Zeitlimit für das Senden von Anforderungen an den Webdienst angeben. Wenn es aus irgendeinem Grund nicht reagiert, scheint der Kunde nur für immer die Räder zu drehen.
Das Herumjagen hat gezeigt, dass ich wahrscheinlich versuchen sollte, so etwas zu tun:
((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.ws.request.timeout", 10000);
((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.ws.connect.timeout", 10000);
Ich habe auch festgestellt, dass Sie je nach Version von JAXWS-RI möglicherweise stattdessen folgende Eigenschaften festlegen müssen:
((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.internal.ws.request.timeout", 10000);
((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.internal.ws.connect.timeout", 10000);
Das Problem, das ich habe, ist, dass ich nicht weiß, wo ich das tun kann , unabhängig davon, welche der oben genannten Aussagen richtig ist . Ich habe nur eine Service
Unterklasse, die die automatisch generierte Schnittstelle zum Webservice implementiert. Wenn die WSDL nicht mehr reagiert, ist es bereits zu spät, die Eigenschaften festzulegen:
MyWebServiceSoap soap;
MyWebService service = new MyWebService("http://www.google.com");
soap = service.getMyWebServiceSoap();
soap.sendRequestToMyWebService();
Kann mich jemand in die richtige Richtung weisen?!
Antworten:
Ich weiß, dass dies alt ist und woanders beantwortet wurde, aber hoffentlich schließt dies dies ab. Ich bin nicht sicher, warum Sie die WSDL dynamisch herunterladen möchten, aber die Systemeigenschaften:
sollte für alle Lese- und Verbindungsvorgänge mit HttpURLConnection gelten, die JAX-WS verwendet. Dies sollte Ihr Problem lösen, wenn Sie die WSDL von einem Remotestandort erhalten - aber eine Datei auf Ihrer lokalen Festplatte ist wahrscheinlich besser!
Wenn Sie Zeitüberschreitungen für bestimmte Dienste festlegen möchten, müssen Sie Ihren Proxy nach dem Erstellen in einen BindingProvider (den Sie bereits kennen) umwandeln, den Anforderungskontext abrufen und Ihre Eigenschaften festlegen. Die Online-JAX-WS-Dokumentation ist falsch, dies sind die richtigen Eigenschaftsnamen (nun, sie funktionieren für mich).
Natürlich ist dies eine schreckliche Art, Dinge zu tun. Ich würde eine schöne Fabrik für die Herstellung dieser Bindungsanbieter schaffen, in die die gewünschten Timeouts injiziert werden können.
quelle
Die Eigenschaften in der akzeptierten Antwort haben bei mir nicht funktioniert, möglicherweise weil ich die JBoss-Implementierung von JAX-WS verwende.
Die Verwendung eines anderen Satzes von Eigenschaften (im JBoss JAX-WS-Benutzerhandbuch zu finden ) hat funktioniert:
quelle
Hier ist meine Arbeitslösung:
quelle
Das hat bei mir funktioniert.
quelle
Wenn Sie JAX-WS unter JDK6 verwenden, verwenden Sie die folgenden Eigenschaften:
quelle
com.sun.xml.internal.ws.connect.timeout
vscom.sun.xml.ws.connect.timeout
) auch von der Klasse (oder Schnittstelle), die sie definiert (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
). Meine beste Idee ist es, beides festzulegen und Literalwerte als Schlüssel zu verwenden.Wenn Ihr App-Server WebLogic ist (für mich war es 10.3.6), sind folgende Eigenschaften für Zeitüberschreitungen verantwortlich:
quelle
Ich bin mir nicht sicher, ob dies in Ihrem Kontext hilfreich ist ...
Kann das Seifenobjekt als BindingProvider gegossen werden?
Wenn Sie andererseits das Zeitlimit für die Initialisierung des MyWebService-Objekts festlegen möchten, hilft dies nicht.
Dies funktionierte für mich, als ich die einzelnen WebService-Aufrufe zeitlich festlegen wollte.
quelle
Der einfachste Weg, um ein langsames Abrufen der Remote-WSDL zu vermeiden, wenn Sie Ihre SEI instanziieren, besteht darin, die WSDL zur Laufzeit nicht vom Remote-Service-Endpunkt abzurufen.
Dies bedeutet, dass Sie Ihre lokale WSDL-Kopie jedes Mal aktualisieren müssen, wenn der Dienstanbieter eine Änderung vornimmt, aber auch, wenn Sie Ihre lokale Kopie jedes Mal aktualisieren müssen, wenn der Dienstanbieter eine Änderung vornimmt.
Wenn ich meine Client-Stubs generiere, weise ich die JAX-WS-Laufzeit an, die SEI so zu kommentieren, dass sie die WSDL von einem vorgegebenen Speicherort im Klassenpfad liest. Standardmäßig ist der Speicherort relativ zum Paketspeicherort der Service-SEI
Das wsldLocation-Attribut teilt der SEI mit, wo sich die WSDL befindet, und die Kopie stellt sicher, dass sich die wsdl (und die unterstützende xsd .. etc ..) an der richtigen Position befindet.
Da der Speicherort relativ zum Speicherort des SEI-Pakets ist, erstellen wir ein neues Unterpaket (Verzeichnis) mit dem Namen wsdl und kopieren dort alle wsdl-Artefakte.
Alles, was Sie an dieser Stelle tun müssen, ist sicherzustellen, dass Sie alle * .wsdl, * .xsd zusätzlich zu allen * .class einschließen, wenn Sie Ihre Client-Stub-Artefakt-JAR-Datei erstellen.
(Falls Sie neugierig sind, befindet sich in der Annotation @webserviceClient dieser wsdl-Speicherort tatsächlich im Java-Code
quelle