web-dev-qa-db-fra.com

apache cxf n'a pas pu envoyer de message et lire le délai d'attente

Quelle pourrait être la cause de:

org.Apache.cxf.interceptor.Fault: Could not send Message.

Caused by: Java.net.SocketTimeoutException: SocketTimeoutException invoking https://xxx.xxx.xxx.xxx:8443/services/test: Read timed out

Cela se produit généralement après que j'envoie une demande de savon à la ws. J'utilise Apache cxf. Je suis tout à fait sûr que la variable ws est opérationnelle car avant la fin du délai imparti, le client enverra 2 autres requêtes. La temporisation se produit dans la troisième demande soap.

15
irumi

J'ai également rencontré cette erreur pour mon client Webservice. La solution qui a fonctionné pour moi consiste à configurer le client http dans le fichier de configuration CXF (cxf.xml).

Comme indiqué dans document Apache CXF :

1.Ajouter l'espace de noms http-conduit et xsd:

<beans ...
       xmlns:http-conf="http://cxf.Apache.org/transports/http/configuration
       ...
       xsi:schemaLocation="...
           http://cxf.Apache.org/transports/http/configuration
           http://cxf.Apache.org/schemas/configuration/http-conf.xsd
       ...">

2. Ajoutez le tag/élément http-conduit et définissez RecieveTimeout/ConnectionTimeout sur 180000ms:

<http-conf:conduit name="*.http-conduit">
      <http-conf:client 
                      ConnectionTimeout="300000"
                      ReceiveTimeout="300000"/>       
</http-conf:conduit>
16

Le message d'erreur signifie que votre client de service Web essayait de recevoir des données d'un service Web distant sur le réseau, mais qu'aucune donnée n'a été reçue pendant une période spécifique. Le client de service Web a donc cessé d'attendre que les données soient reçues.

Une des causes possibles pourrait être que la propriété timeout est trop basse. Par défaut, les valeurs par défaut de cxf sont respectivement de 30000 et 60000 ms. Ceux-ci peuvent être modifiés en fonction de la manière dont vous créez votre client.

Si vous créez un client à l'aide de code Java, vous pouvez utiliser:

//1 minute for connection
((BindingProvider) wsPort).getRequestContext().put("com.Sun.xml.ws.connect.timeout", 1 * 60 * 1000); 

//3 minutes for request
((BindingProvider) wsPort).getRequestContext().put("com.Sun.xml.ws.request.timeout", 3 * 60 * 1000); 

Si vous utilisez Spring, vous pouvez utiliser une carte comme celle-ci:

<util:map id="jaxwsProperties">
    <entry key="com.Sun.xml.internal.ws.request.timeout">
        <value type="Java.lang.Integer">120000</value>
    </entry>
    <entry key="com.Sun.xml.internal.ws.connect.timeout">
        <value type="Java.lang.Integer">60000</value>
    </entry>
</util:map>

Puis définissez cette carte dans votre configuration <jaxws:client.../>.

11
Paulius Matulionis

Une autre approche de la configuration des délais de configuration (par programmation):

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
Object serviceClass = factory.create();
defineTimeouts(serviceClass);

static void defineTimeouts(Object serviceClass) {
    Client cxfClient = ClientProxy.getClient(serviceClass);
    HTTPConduit httpConduit = (HTTPConduit) cxfClient.getConduit();

    HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
    httpClientPolicy.setConnectionTimeout(DEFAULT_CLIENT_CONNECTION_TIMEOUT);
    httpClientPolicy.setReceiveTimeout(DEFAULT_CLIENT_RECEIVE_TIMEOUT);
    httpConduit.setClient(httpClientPolicy);
}
2
Bob Rivers

Vous voudrez peut-être modifier le paramètre receiveTimeout d'Apache CXF src et remplacer le fichier cxf-rt-transports-http-version.jar existant sur votre serveur.

Brèves instructions: (vous avez les instructions de Wildfly 8.2/temps de lecture en fin de boucle )

  1. Téléchargez le fichier src CXF2.7.16 à partir d'Apache
  2. Ajoutez maven/bin à PATH
  3. Exportez MAVEN_OPTS = -Xmx512m pour corriger les erreurs de permgen
  4. Ouvrez ./rt/transports/http/src/main/resources/schemas/wsdl/http-conf.xsd et remplacez ReceiveTimeout par 60000 selon vos besoins. 600000 (10 minutes)
  5. Exécuter mvn -Pfastinstall
  6. Récupérez le dossier "corrigé" cxf-rt-transports-http-2.7.16.jar à partir du dossier ./rt/transports/http/target
  7. Remplacez cxf-rt-transports-http-2.7.16.jar sur votre serveur. Par exemple, avec wildfly8.2, il se trouve dans le dossier .//modules/system/layers/base/org/Apache/cxf/impl/main et n'oubliez pas de mettre à jour module.xml dans le même dossier pour utiliser ce correctif cxf-rt -transports-http-2.7.16.jar.

Cela devrait résoudre l'exception SocketTimeoutException causée par Apache CXF sous-jacent utilisé sur le serveur.

0
Henry Neo