J'ai utilisé JAXWS-RI 2.1 pour créer une interface pour mon service Web, basée sur un WSDL. Je peux interagir avec le service Web sans problème, mais je n'ai pas été en mesure de spécifier un délai d'expiration pour l'envoi des demandes au service Web. Si, pour une raison quelconque, il ne répond pas, le client semble juste faire tourner ses roues pour toujours.
La chasse a révélé que je devrais probablement essayer de faire quelque chose comme ceci:
((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.ws.request.timeout", 10000);
((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.ws.connect.timeout", 10000);
J'ai également découvert que, selon la version de JAXWS-RI dont vous disposez, vous devrez peut-être définir ces propriétés à la place:
((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.internal.ws.request.timeout", 10000);
((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.internal.ws.connect.timeout", 10000);
Le problème que j'ai est que, indépendamment de ce qui est correct, je ne sais pas où je peux faire cela. Tout ce que j'ai, c'est une Service
sous-classe qui implémente l'interface générée automatiquement pour le service Web et au moment où cela est instancié, si le WSDL ne répond pas, il est déjà trop tard pour définir les propriétés:
MyWebServiceSoap soap;
MyWebService service = new MyWebService("http://www.google.com");
soap = service.getMyWebServiceSoap();
soap.sendRequestToMyWebService();
Est-ce que quelqu'un peut-il me montrer la bonne direction?!
Réponses:
Je sais que c'est vieux et que j'ai répondu ailleurs, mais j'espère que cela met fin à cela. Je ne sais pas pourquoi vous voudriez télécharger le WSDL dynamiquement mais les propriétés système:
devrait s'appliquer à toutes les lectures et connexions à l'aide de HttpURLConnection que JAX-WS utilise. Cela devrait résoudre votre problème si vous obtenez le WSDL à partir d'un emplacement distant - mais un fichier sur votre disque local est probablement meilleur!
Ensuite, si vous souhaitez définir des délais d'expiration pour des services spécifiques, une fois que vous avez créé votre proxy, vous devez le convertir en BindingProvider (que vous connaissez déjà), obtenir le contexte de la demande et définir vos propriétés. La documentation en ligne JAX-WS est fausse, ce sont les noms de propriété corrects (enfin, ils fonctionnent pour moi).
Bien sûr, c'est une façon horrible de faire les choses, je créerais une belle usine pour produire ces fournisseurs de liaison qui peuvent être injectés avec les délais d'attente que vous souhaitez.
la source
Les propriétés de la réponse acceptée n'ont pas fonctionné pour moi, peut-être parce que j'utilise l'implémentation JBoss de JAX-WS?
L'utilisation d'un ensemble de propriétés différent (trouvé dans le Guide de l'utilisateur JBoss JAX-WS ) a permis de le faire fonctionner:
la source
Voici ma solution de travail:
la source
Cela a fonctionné pour moi.
la source
Si vous utilisez JAX-WS sur JDK6, utilisez les propriétés suivantes:
la source
com.sun.xml.internal.ws.connect.timeout
vscom.sun.xml.ws.connect.timeout
) également la classe (ou l'interface) qui les définissent (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
). Ma meilleure idée est de définir les deux, en utilisant des valeurs littérales comme clés.Si votre serveur d'applications est WebLogic (pour moi, c'était 10.3.6), les propriétés responsables des délais d'expiration sont:
la source
Je ne sais pas si cela vous aidera dans votre contexte ...
L'objet soap peut-il être converti en BindingProvider?
D'un autre côté, si vous souhaitez définir le délai d'expiration de l'initialisation de l'objet MyWebService, cela ne vous aidera pas.
Cela a fonctionné pour moi lorsque je voulais expirer les appels individuels de WebService.
la source
le moyen le plus simple d'éviter une récupération lente du WSDL distant lorsque vous instanciez votre SEI est de ne pas récupérer le WSDL à partir du point de terminaison de service distant au moment de l'exécution.
cela signifie que vous devez mettre à jour votre copie WSDL locale chaque fois que le fournisseur de services effectue une modification ayant un impact, mais cela signifie également que vous devez mettre à jour votre copie locale chaque fois que le fournisseur de services effectue une modification ayant un impact.
Lorsque je génère mes stubs client, je dis au runtime JAX-WS d'annoter le SEI de manière à ce qu'il lise le WSDL à partir d'un emplacement prédéterminé sur le chemin de classe. par défaut, l'emplacement est relatif à l'emplacement du package du Service SEI
l'attribut wsldLocation indique au SEI où il peut trouver le WSDL, et la copie s'assure que le wsdl (et le support xsd .. etc.) est au bon emplacement.
puisque l'emplacement est relatif à l'emplacement du package du SEI, nous créons un nouveau sous-package (répertoire) appelé wsdl, et y copions tous les artefacts wsdl.
tout ce que vous avez à faire à ce stade est de vous assurer d'inclure tous les fichiers * .wsdl, * .xsd en plus de tous les * .class lorsque vous créez votre fichier jar d'artefact de stub client.
(au cas où vous êtes curieux, l'annotation @webserviceClient est l'endroit où cet emplacement wsdl est réellement défini dans le code java
la source