Comment puis-je définir le délai d'attente pour un JAX-WS webservice client?
J'ai utilisé JAXWS-RI 2.1 pour créer une interface pour mon web service, basé sur un document WSDL. Je peux interagir avec le service web pas de problèmes, mais je n'ai pas été en mesure de spécifier un délai pour l'envoi des demandes pour le service web. Si, pour une raison quelconque, il ne répond pas, le client semble juste pour faire tourner les roues pour toujours.
Chasse autour de, a révélé que je devrais probablement être en train d'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 aussi découvert que, selon la version de JAXWS-RI vous avez, vous devez 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, c'est que, indépendamment de la méthode ci-dessus est correcte, je ne sais pas où je peux le faire. Tout ce que j'ai obtenu est un Service
sous-classe qui implémente l'auto-généré à l'interface du service web et au point que cela devient instanciée, si le WSDL est non réactif, alors qu'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();
Quelqu'un peut me pointer dans la bonne direction?!
- Je ne pense pas que j'ai une réponse pour vous, mais votre question m'a aidé à résoudre mon problème. Je savais à propos de la com.soleil.xml.ws.demande.propriété de délai d'attente, mais pas sur les com.soleil.xml.interne.ws.demande.délai d'attente de un.
Vous devez vous connecter pour publier un commentaire.
Je sais que c'est vieux et a répondu d'ailleurs mais j'espère que cela ferme ce vers le bas. Je ne suis pas sûr de savoir pourquoi vous voulez télécharger le WSDL de manière dynamique, mais les propriétés du système:
devrait s'appliquer à toutes les lectures et se connecte à l'aide HttpURLConnection qui JAX-WS utilise. Cela devrait résoudre votre problème si vous êtes obtenir le WSDL à partir d'un emplacement distant - mais un fichier sur votre disque local est probablement mieux!
Ensuite, si vous souhaitez définir des délais d'attente pour certains services, une fois que vous avez créé votre procuration, vous devez la convertir en une BindingProvider (que vous connaissez déjà), d'obtenir le contexte de la demande et de l'ensemble de vos propriétés. En ligne JAX-WS documentation est faux, ces sont la propriété correcte des noms (bien, ils travaillent pour moi).
Bien sûr, c'est une horrible façon de faire les choses, je voudrais créer une belle usine pour la production de ces contraignant les fournisseurs qui peuvent être injectés avec les délais que vous souhaitez.
Les propriétés dans l'acceptation réponse n'a pas fonctionné pour moi, peut-être parce que je suis à l'aide de JBoss mise en œuvre de JAX-WS?
L'aide d'un autre ensemble de propriétés (qui se trouve dans le JBoss JAX-WS User Guide) fait le travail:
Voici ma solution de travail :
Cela a fonctionné pour moi.
Si vous êtes à l'aide de JAX-WS sur JDK6, utilisez les propriétés suivantes:
com.sun.xml.internal.ws.connect.timeout
vscom.sun.xml.ws.connect.timeout
) aussi 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 d'installer les deux, à l'aide de valeurs littérales comme clés.Dans le cas où votre serveur d'applications est WebLogic (pour moi c'était 10.3.6) puis propriétés responsable pour les délais d'attente sont:
Ne sais pas si cela va aider dans votre contexte...
Pouvez le savon objet d'être jeté comme un BindingProvider ?
D'autre part, si vous êtes désireux de définir le délai d'attente sur l'initialisation de l'MyWebService objet alors ce ne sera pas vous aider.
Cela a fonctionné pour moi quand on veut délai d'attente de la personne WebService appels.
la façon la plus simple afin de ne pas ralentir la récupération de la télécommande WSDL lorsque vous instanciez votre SEI est de ne pas récupérer le fichier WSDL à partir de la télécommande point de terminaison de service au moment de l'exécution.
cela signifie que vous devez mettre à jour votre local WSDL copie de tout temps, le fournisseur de services à un impact sur le changement, mais cela signifie également que vous devez mettre à jour votre copie locale à tout moment, le fournisseur de services à un impact sur le changement.
Quand je générer mon client talons, je dis JAX-WS exécution d'annoter le SEI de telle manière qu'il va lire le fichier WSDL à partir d'un emplacement prédéterminé dans le classpath. par défaut, l'emplacement est relatif à l'emplacement du package du Service SEI
la wsldLocation attribut indique le SEI où est pouvez trouver le WSDL, et la copie permet de s'assurer que le wsdl (et en soutenant xsd.. etc..) est à l'emplacement correct.
depuis l'emplacement est relatif au SEI de l'emplacement du package, nous allons créer un nouveau sous-package (répertoire) appelé wsdl, et copiez tous les fichiers wsdl artefacts là.
tout ce que vous avez à faire à ce stade est assurez-vous d'inclure tous les *.wsdl, *.xsd en plus de tous *.classe lorsque vous créez votre client stub artefact fichier jar.
(dans le cas où votre curiosité, l' @webserviceClient annotation est où cet emplacement wsdl est en fait défini dans le code java