Was könnte die Ursache sein für:
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
Es tritt normalerweise auf, nachdem ich eine Seifenanfrage an die Variable ws
gesendet habe. Ich benutze Apache cxf
. Ich bin mir absolut sicher, dass die ws
läuft, da der Client vor dem Timeout 2 weitere Anfragen sendet. Das Timeout geschieht in der dritten Seifenanfrage.
Dieser Fehler ist auch für meinen Webservice-Client aufgetreten. Die Lösung, die für mich funktioniert hat, ist die Konfiguration des http-Clients in der CXF-Konfigurationsdatei (cxf.xml).
Wie in Apache CXF-Dokument dokumentiert :
1.Fügen Sie den http-conduit-Namespace und xsd hinzu:
<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. Fügen Sie das http-conduit-Tag/-Element hinzu und setzen Sie RecieveTimeout/ConnectionTimeout auf 180000ms:
<http-conf:conduit name="*.http-conduit"> <http-conf:client ConnectionTimeout="300000" ReceiveTimeout="300000"/> </http-conf:conduit>
Die Fehlermeldung bedeutet, dass Ihr Web-Service-Client versucht hat, Daten von einem Remote-Web-Service über das Netzwerk zu empfangen, es wurden jedoch für einen bestimmten Zeitraum keine Daten empfangen. Der Web-Service-Client hat also auf den Empfang der Daten gewartet.
Eine der möglichen Ursachen könnte sein, dass die timeout
-Eigenschaft zu niedrig ist. Die Standardwerte sind cxf Standardwerte von 30000 bzw. 60000 ms. Diese können abhängig davon geändert werden, wie Sie Ihren Kunden erstellen.
Wenn Sie einen Client mit Java-Code erstellen, können Sie Folgendes verwenden:
//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);
Wenn Sie Spring verwenden, können Sie eine Karte wie folgt verwenden:
<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>
Setzen Sie dann diese Karte in Ihre <jaxws:client.../>
-Konfiguration.
Ein weiterer Ansatz zur Konfiguration von Zeitüberschreitungen (programmgesteuert):
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);
}
Möglicherweise möchten Sie die Einstellung für receiveTimeout von Apache CXF-Quelle ändern und die vorhandene Datei cxf-rt-transports-http-version.jar auf Ihrem Server ersetzen.
Kurzanleitung: (erhielt die Anweisungen von Wildfly 8.2/underow read time out )
Dies sollte die SocketTimeoutException beheben, die durch den zugrunde liegenden Apache CXF verursacht wird, der auf dem Server verwendet wird.