Comment définir un délai d'expiration de connexion lors de l'utilisation de JAXRPC-RI client de services web?
Je travaille avec un peu de l'héritage de la composante dont nous interagissons avec un web service SOAP (une technologie qui j'ai absolument horreur) à l'aide de certains clients du code en utilisant le JAXRPC-RI (l'implémentation de référence) de la bibliothèque.
Je suis intéressé à être en mesure de définir un délai d'attente avec les bouchons de sorte que dans le cas où le serveur de services web ne répond pas dans les X secondes, l'application n'est pas en paramètre n'y a jamais d'attente pour une réponse.
Que j'utilise pour travailler avec des clients/talons généré par Apache Axis, dans lequel vous pouvez simplement utiliser org.apache.axis.client.Stub.setTimeout()
pour définir un délai d'attente.
Pour la vie de moi je ne peux pas comprendre comment définir un délai d'attente lors de l'utilisation de Talons créé avec JAXRPC-RI:
- Le port de classe, je suis de l'instanciation s'étend
com.sun.xml.rpc.client.StubBase
et met en œuvrejavax.xml.rpc.Stub
etcom.sun.xml.rpc.spi.runtime.StubBase
. - La Javadoc aucune de ces classes mention toute sorte de délai d'attente ou de méthode pour ce faire.
- Essayer de code comme
stub._setProperty("axis.connection.timeout", 1000);
d'obtenir une exception à l'exécution:javax.xml.rpc.JAXRPCException: Stub does not recognize property: axis.connection.timeout
Quelqu'un a une idée sur comment faire pour installer/faire respecter un délai d'attente lors de l'utilisation d'un JAXRPC-RI client? Est-il même possible?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez avoir de la chance définition des propriétés telles que
sun.net.client.defaultConnectTimeout
ousun.net.client.defaultReadTimeout
, mais qui serait alors de mettre en place un système à l'échelle de délai d'attente.Dans le code les valeurs des propriétés sont définies à l'aide de Cordes:
Pour un test rapide, il peut être plus facile de définir la variable d'environnement
JAVA_OPTS
ou utiliser la ligne de commande:Je ne suis pas sûr pourquoi ce JAXRPC mise en œuvre va sortir de sa façon de faire, il est difficile de définir le délai d'attente. Peut-être, il y a une bonne raison pour cela. D'autres implémentations telles que l'Axe et, je crois, JAX-WS, laissez vous suffit d'appeler le setTimeout() la méthode sur le Talon. Après quelques douleurs, j'ai été en mesure de venir avec cette solution. J'espère que cela pourra être utile. Vous devrez effectuer les opérations suivantes afin de définir le délai d'attente sur le sous-jacent URLConnection:
Remarque: assurez-vous que quel que soit ce que vous appelez pour générer les Stubs via wscompile (script Ant?) ne pas remplacer les 3 classes Java que vous venez de créer et/ou modifier. Il a probablement fait sens pour les déplacer vers un autre paquet, de sorte qu'ils ne finissent pas d'être écrasées.
Eugène Treyvus réponse est très bonne, mais les résultats dans un nouveau HTTPUrlConnection être créé pour chaque appel SOAP.
J'ai découvert lors des tests de son approche, que l'on peut définir un ClientTransportFactory.
J'utilise désormais un CustomClientTransportFactory et le mettre sur le Stub ( moulage StubBase ).
Puis on n'a pas besoin de l'étape 2 et 3.
Dans l'étape 4, on définit alors son nouveau ClientTransportFactory comme suit:
((StubBase) myPort)._setTransportFactory(nouveau CustomClientTransportFactory());
Je sais que vous êtes en utilisant de l'Axe mais j'ai du mal à trouver la même réponse pour Weblogic et puisque votre question de titre et les balises sont génériques, voici ma solution.
Dans mon client de la classe qui implémente l'généré MyObject interface, j'ai adapté les getServicePort() comme suit (notez que j'ai aussi de la sécurité ici).
La documentation Oracle est ici: http://docs.oracle.com/cd/E12840_01/wls/docs103/webserv_rpc/client.html#wp241849 mais il indique à tort que le délai d'attente est en secondes. Il est en fait en millisecondes !
Je vais juste essayer de récolter le butin, afin de ne pas tirer sur moi si je suis complètement sur la mauvaise voie 🙂 Si votre demande est "paramètre n'y a jamais d'attente pour une réponse" que vous pourriez faire la demande dans un thread séparé et après la ponte votre
requestThread
vous pourrait simplement direrequestThread.join(max_time_to_wait);
le prochain appel serait de vérifier si le requestThread est toujours vivant et si il ce alors essayer de le tuer.Vous demande allons passer après un temps-et ce n'est pas la plus inélégante solution...
Ray,
Merci pour vos commentaires. Semble que votre approche est supérieur car il permettra d'éviter un couple de des étapes superflues. Je vais devoir prendre un coup d'oeil. Cependant, à moins que quelque chose m'échappe, je ne crois pas supplémentaire HttpConnection est créé le YourClientTransport.createHttpConnection(String s, SOAPMessageContext ctx) doit l'emporter sur la HttpClientTransport un:
Peut-être un peu tard pour cette question mais je suis venu à ce problème aujourd'hui.
Basé sur une solution proposée par Eugène Treyvus (merci pour elle!) Je suis venu avec les éléments suivants:
C'est fondamentalement le même que Yevgeniy proposé, mais avec un peu moins de substituant (avec l'aide d'une connexion d'usine).
Vous devez utiliser: