Search code examples
javatimeoutjax-wshttpurlconnection

What is the exact difference between "java.net.ConnectException: Connection timed out" and "java.net.SocketTimeoutException: connect timed out"?


In my logs I can find the two following stacktraces

Caused by: java.net.ConnectException: Connection timed out  
at java.net.PlainSocketImpl.socketConnect(Native Method)    
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345) 
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)  
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)   
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)   
at java.net.Socket.connect(Socket.java:589) 
at sun.net.NetworkClient.doConnect(NetworkClient.java:175)  
at sun.net.www.http.HttpClient.openServer(HttpClient.java:432)  
at sun.net.www.http.HttpClient.openServer(HttpClient.java:527)  
at sun.net.www.http.HttpClient.<init>(HttpClient.java:211)  
at sun.net.www.http.HttpClient.New(HttpClient.java:308) 
at sun.net.www.http.HttpClient.New(HttpClient.java:326) 
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1168)    
at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1147)   
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:998) 
at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:932)  
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream0(HttpURLConnection.java:1282)    
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1257) 
at com.sun.xml.internal.ws.transport.http.client.HttpClientTransport.getOutput(HttpClientTransport.java:104)    ... 127 more

and

Caused by: java.net.SocketTimeoutException: connect timed out   
at java.net.PlainSocketImpl.socketConnect(Native Method)    
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345) 
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)  
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)   
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)   
at java.net.Socket.connect(Socket.java:589) 
at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:656)   
at sun.net.NetworkClient.doConnect(NetworkClient.java:175)  
at sun.net.www.http.HttpClient.openServer(HttpClient.java:432)  
at sun.net.www.http.HttpClient.openServer(HttpClient.java:527)  
at sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:275)  
at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:371) 
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:191)  
at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1147)   
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:998) 
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:177)   
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream0(HttpURLConnection.java:1282)    
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1257) 
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:250)   
at com.sun.xml.internal.ws.transport.http.client.HttpClientTransport.getOutput(HttpClientTransport.java:104)    ... 50 more

Both exceptions occur during webservice calls with JAXWS-RI (reference implementation). What is the exact difference between these two exceptions.

To configure timeouts I set some properties in the context, one is for the connect timeout:

BindingProvider bindingProvider = (BindingProvider) port;
Map<String, Object> context = bindingProvider.getRequestContext();
context.put(JAXWSProperties.REQUEST_TIMEOUT, 90000);
context.put(JAXWSProperties.CONNECT_TIMEOUT, 90000);

As far as I can see from the logs, only the java.net.SocketTimeoutExceptionseems to respect the JAXWSProperties.CONNECT_TIMEOUT settings.

java.net.ConnectExceptions occurs before 90 seconds are over.


Solution

  • I think my question was already answered here.

    The two mentioned exceptions are coming from native code. As user5436 already mentioned, the SocketTimeoutExceptions occurs when a timeout is set and no connection can be established in the desired time. The ConnectException is thrown, when an error occurs while trying to establish the connection. Confusingly this can also be a Connect Timeout.