webentwicklung-frage-antwort-db.com.de

apache CXF konnte keine Nachricht senden und Timeout lesen

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.

15
irumi

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.

11

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);
}
2
Bob Rivers

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 )

  1. Laden Sie CXF2.7.16 src von Apache herunter
  2. Maven/bin zu PATH hinzufügen
  3. Exportieren Sie MAVEN_OPTS = -Xmx512m, um Permgenfehler zu beheben
  4. Öffnen Sie ./rt/transports/http/src/main/resources/schemas/wsdl/http-conf.xsd und ändern Sie ReceiveTimeout von 60000 in das, was z. 600000 (10 Minuten)
  5. Führen Sie mvn -Pfastinstall aus
  6. Holen Sie sich den "gepatchten" cxf-rt-transports-http-2.7.16.jar aus dem Ordner ./rt/transports/http/target
  7. Ersetzen Sie cxf-rt-transports-http-2.7.16.jar in Ihrem Server. Mit wildfly8.2 ist es beispielsweise im Ordner .//modules/system/layers/base/org/Apache/cxf/impl/main. Denken Sie daran, die Datei modul.xml im selben Ordner zu aktualisieren, um dieses gepatchte cxf-rt zu verwenden -transports-http-2.7.16.jar.

Dies sollte die SocketTimeoutException beheben, die durch den zugrunde liegenden Apache CXF verursacht wird, der auf dem Server verwendet wird.

0
Henry Neo