2010-06-10 4 views
10

Je dois implémenter un client de service Web dans un fichier WSDL donné. J'ai utilisé l'outil 'wsimport' du SDK pour créer des classes Java à partir du WSDL ainsi qu'une classe qui enveloppe la seule méthode du webservice (enhanceAddress(auth, param, address)) dans une méthode java simple. Jusqu'ici tout va bien. Le webservice est fonctionnel et renvoie les résultats correctement. Le code ressemble à ceci:Détails de connexion et délais d'expiration dans un client de service Web Java

try { 
    EnhancedAddressList uniservResponse = getWebservicePort().enhanceAddress(m_auth, m_param, uniservAddress); 
    //Where the Port^ is the HTTP Soap 1.2 Endpoint 
}catch (Throwable e) { 
    throw new AddressValidationException("Error during uniserv webservice request.", e); 
} 

Le problème maintenant: Je dois obtenir des informations sur la connexion et toute erreur qui pourrait se produire afin de remplir différentes valeurs JMX (telles que COUNT_READ_TIMEOUT, COUNT_CONNECT_TIMEOUT, ...) Malheureusement, la méthode ne lance officiellement aucune exception, donc pour obtenir des détails sur une exception ConnectException, je dois utiliser getCause() sur le ClientTransportException qui sera lancé. Pire encore: J'ai essayé de tester la valeur du délai d'attente de lecture, mais il n'y en a pas. J'ai changé l'emplacement du service dans le fichier wsdl pour publier la requête dans un script php qui attend toujours et ne revient pas. Devinez quoi: Le client de service Web pas expire mais attend aussi pour toujours (j'ai tué l'application après plus de 30 minutes d'attente). Ce n'est pas une option pour mon application car je finis par manquer de connexions tcp si certains d'entre eux sont bloqués.

La méthode enhanceAddress(auth, param, address) n'est pas implémentée mais annotée avec javax.jws. * Annotations, ce qui signifie que je ne peux pas voir/modifier/inspecter le code réellement exécuté.

Est-ce que j'ai une autre option que de jeter tout le wsimport/javax.jsw-stuff et d'implémenter mon propre client de savon?

Répondre

14

à la configuration-timeout lecture et connecter les délais d'attente, vous pouvez configurer les paramètres de liaison lorsque vous configurez votre service et les instances portuaires:


Service = new Service(); 

    Port = Service.getPort(); 

    ((BindingProvider) Port).getRequestContext().put(
      BindingProvider.ENDPOINT_ADDRESS_PROPERTY, 
      "http://localhost:8080/service"); 
    ((BindingProvider) Port).getRequestContext().put(
      BindingProviderProperties.CONNECT_TIMEOUT, 
      30); 
    ((BindingProvider) Port).getRequestContext().put(
      BindingProviderProperties.REQUEST_TIMEOUT, 
      30); 

maintenant chaque fois que vous exécutez un service via "Port" vous obtiendrez des délais d'attente de réponse et/ou des délais d'attente de connexion si le backend tarde à répondre. les valeurs suivent les valeurs de délai d'expiration de la classe de socket. Lorsque ces délais d'attente sont dépassés, vous recevrez une exception de délai d'attente ou une exception de connexion et vous pouvez mettre un compteur pour garder une trace du nombre de fois que vous obtenez.

+0

Depuis que j'ai eu le problème il y a 2 semaines, j'ai écrit mon propre client. Malgré cela, j'ai testé votre approche et ça marche! J'ai trouvé un morceau de code similaire à l'époque, mais d'une manière ou d'une autre, il m'a donné une exception ClassCastException quand j'ai essayé de lancer BindingProvider. – f1sh

+0

J'ai un problème similaire, MAIS le délai d'attente arrive quand je reçois le port, comment puis-je le résoudre ?? – maugch