2013-01-31 13 views
14

Co może być przyczyną:apache cxf nie mógł wysłać wiadomość i czytać razem z

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

Zazwyczaj występuje po I wysłać żądanie SOAP do ws. Używam apache cxf. Jestem całkowicie pewien, że ws jest uruchomiony, ponieważ przed upływem limitu czasu klient wyśle ​​jeszcze 2 żądania. Limit czasu ma miejsce w trzecim wniosku dotyczącym mydła.

Odpowiedz

10

Komunikat o błędzie oznacza, że ​​klient usługi sieciowej próbował odbierać dane ze zdalnej usługi WWW przez sieć, ale żadne dane nie zostały odebrane przez określony czas, więc klient usługi WWW przestał czekać na dane. otrzymać.

Jedną z możliwych przyczyn może być zbyt niska właściwość timeout. Domyślne wartości domyślne cxf wynoszą odpowiednio 30000 i 60000 ms. Można je zmienić w zależności od tego, jak tworzysz swojego klienta.

Jeśli tworzysz klienta przy użyciu kodu java można użyć:

//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); 

Jeśli używasz Spring, można użyć mapę takiego:

<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> 

Następnie ustaw tę mapę do konfiguracja <jaxws:client.../>.

+0

porządku chory spróbować :) i tak może źle żądanie mydło formatu może również sprawcą błędu ?? ,, przypadkowo wysłał żądanie mydło z zerową wartości/"" następnie nagle otrzymałem odpowiedź mydła ws .. – irumi

+2

Właściwości zmieniły odpowiednio nazwy na 'javax.xml.ws.client.connectionTimeout' i' javax.xml.ws.client.receiveTimeout'. –

14

Napotkano ten błąd również dla mojego klienta usług sieciowych. Rozwiązaniem, które mi pomogło, jest skonfigurowanie klienta http w pliku konfiguracyjnym CXF (cxf.xml).

Jak udokumentowano w Apache CXF document:

1.Add namespace HTTP przewód i 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.Dodaj HTTP, przewód tag/elementów i ustawić RecieveTimeout/ConnectionTimeout do 180000ms:

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

Może zajść potrzeba zmiany ustawienia receiveTimeout z Apache CXF src i zastąpienia istniejącego pliku cxf-rt-transports-http-version.jar na serwerze.

Skrócona instrukcja: (dostał instrukcje od Wildfly 8.2/undertow read time out)

  1. Pobierz CXF2.7.16 src od apache
  2. dodawania Maven/bin do PATH
  3. Export MAVEN_OPTS = -Xmx512m naprawić PermGen błędów
  4. Otwórz ./rt/transports/http/src/main/resources/schemas/wsdl/http-conf.xsd i zmień ReceiveTimeout z 60000 na wszystko, co potrzebne na przykład. 600000 (10 minut)
  5. Uruchom mvn -Pfastinstall
  6. Pobierz "załatany" cxf-rt-transports-http-2.7.16.jar z ./rt/transports/http/target folder
  7. Zamień cxf-rt-transports-http-2.7.16.jar na swoim serwerze. Na przykład w wersji wildfly8.2 znajduje się w folderze .//modules/system/layers/base/org/apache/cxf/impl/main i pamiętaj, aby zaktualizować plik module.xml w tym samym folderze, aby użyć tego poprawionego pliku cxf-rt -transports-http-2.7.16.jar.

To powinno rozwiązać wyjątek SocketTimeoutException spowodowany przez bazowy CXF Apache używany na serwerze.

2

Innym approche config timeout (programowo):

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); 
} 
Powiązane problemy