2010-12-08 49 views
3

Im utilisant Metro 2.0 et J2SE5. L'application que j'ai écrite ne connaît pas le WebService externe au moment de la compilation, il les trouve à l'exécution sur la base d'un fichier XML de logique applicative, donc j'effectue une requête WSDL.JAXWS - aide nécessaire pour définir le délai d'expiration de la requête WSDL

L'exemple de code que je l'ai écrit est comme suit:

String wsdlServiceName = ...; String wsdlURL = ...; Document payload = ...;

final String nsURI = ...; 
final QName serviceName = new QName(nsURI, wsdlServiceName + "Service"); 
final QName servicePort = new QName(nsURI, wsdlServiceName + "Port"); 

// Create service and the dispatcher for the SOAP message 
Service service = Service.create(new URL(wsdlURL), serviceName); 
dispatch = service.createDispatch(servicePort, SOAPMessage.class, Service.Mode.MESSAGE); 

// Set timeouts 
dispatch.getRequestContext().put("com.sun.xml.internal.ws.request.timeout", 3000); 
dispatch.getRequestContext().put("com.sun.xml.internal.ws.connect.timeout", 3000); 

// Create the outgoing SOAP request 
SOAPBinding soapBinding = (SOAPBinding) dispatch.getBinding(); 
request = soapBinding.getMessageFactory().createMessage(); 

SOAPBody requestBody = request.getSOAPBody(); 
requestBody.addDocument(payload); 

// Invoke web service operation 
SOAPMessage response = dispatch.invoke(request); 

Le délai d'attente fonctionne correctement lorsque le service Web est appelé (dispatcher.invoke (demande))

Cependant, le WSDL est demandé avant que les délais d'attente ne soient définis et si le service Web ne répond pas, cela prend 90 secondes avant que la connexion ne soit expirée.

Est-il possible de définir les délais avant que le WSDL ne soit demandé? Vous avez besoin d'un répartiteur pour définir les délais, mais cela est fait APRÈS la création du Service qui demande le WSDL?! (Ie. Service.create())

Répondre

1

Essayez la propriété du système de réglage

sun.net.client.defaultConnectTimeout 

mais de Networking Properties il dit qu'il ne peut pas être pris en charge dans les versions futures

Cependant, je suggère de cache le WSDL et ne pas y accéder à distance.
Les performances sont meilleures, surtout si vous utilisez un WSDL qui ne devrait pas changer fréquemment.

+0

Bonjour. Merci pour votre commentaire, je vais essayer. Par intérêt, savez-vous si mon programme peut être modifié pour définir les ws-timeouts avant que le WSDL ne soit demandé? J'aurais pensé que cela devrait être possible? – Alex

+0

@Alex: Je pense que le WSDL est accessible à 'Service.create (nouvelle URL (wsdlURL), serviceName);'. Étant donné que le paramètre de délai d'attente est sur le répartiteur, je ne vois pas comment il est possible de le définir avant. Les propriétés du système devraient cependant vous aider puisque jax-ws utilise HttpUrlConnection sous les couvertures pour la communication avec le serveur. À mon humble avis, vous devez garder le wsdl en cache pour éviter l'extraction à distance et également éviter ce genre de problèmes. – Cratylus

+0

@Alex: Cochez cette case http://mail-archives.apache.org/mod_mbox/cxf-users/200902.mbox/%[email protected]%3E – Cratylus

1

Nous venons de rencontrer ce même problème et avons essayé tous les paramètres mentionnés ci-dessus, sans succès.

Notre solution était de télécharger d'abord le fichier WSDL dans un fichier temporaire en utilisant URL.openConnection() (en définissant les délais d'attente sur la connexion avec: URLConnection.setConnectionTimeout() et URLConnection.setReadTimeout()). Nous générons ensuite une url pour ce fichier avec: File.toURI(). ToURL(), que nous transmettons au constructeur de service qui prend une URL. Cette approche vous permet de récupérer dynamiquement le WSDL en cours, tout en contrôlant explicitement le délai d'expiration. Nous définissons ensuite le délai d'attente pour les appels ultérieurs au service, comme indiqué dans le message d'origine.

+0

Qu'en est-il du XSD? Les points WSDL téléchargés vers le XSD. Je me demandais juste: JAX-WS RI (aka Metro) essaiera-t-il aussi de télécharger celui-là aussi? – peterh

+0

Je ne suis pas certain (cela fait des années que j'ai regardé cela) - mais peut-être que le délai spécifié (plus long) est utilisé à ce moment-là. Ce que je sais, c'est que cela a résolu le problème. :) –

+0

Je suppose que je voulais dire: Qui sait vraiment ce que méta-données JAX-WS RI nécessite à l'exécution ?. Essaiera-t-il seulement de se procurer le fichier .wsdl ou essaiera-t-il aussi de se procurer le fichier .xsd? Le fichier .wsdl a un lien vers le fichier .xsd. J'ai vu JAX-WS RI demandant le fichier .xsd du serveur (bien que cela ne semble pas se produire dans le cas «normal»). En d'autres termes: Un jour, votre solution risque de se casser, car JAX-WS RI essayera tout à coup ** aussi ** d'obtenir le fichier .xsd ... et alors? (une partie de ceci est spéculative) – peterh