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.
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>
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.../>
.
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);
}
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 )
Cela devrait résoudre l'exception SocketTimeoutException causée par Apache CXF sous-jacent utilisé sur le serveur.