Anthony Communier created CXF-5590:
--------------------------------------
Summary: On socket timeout an IllegalStateException is thrown
Key: CXF-5590
URL: https://issues.apache.org/jira/browse/CXF-5590
Project: CXF
Issue Type: Bug
Components: Transports
Affects Versions: 2.7.10
Environment: Windows 7 64 bits & RedHat 6.4
Reporter: Anthony Communier
Priority: Minor
When a socket timeout occurs during a Jaxrs async request (I do not have done
the test on synchronous request) the following exception is thrown :
javax.ws.rs.client.ClientException: javax.ws.rs.client.ClientException:
java.lang.IllegalStateException: IllegalStateException invoking
http://localhost:50324/geoloc?ip=10.1.1.2&lang=en: Already connected
at
org.apache.cxf.jaxrs.client.JaxrsClientCallback.handleException(JaxrsClientCallback.java:90)
~[cxf-rt-frontend-jaxrs-2.7.10.jar:2.7.10]
at
org.apache.cxf.jaxrs.client.WebClient.handleAsyncResponse(WebClient.java:988)
~[cxf-rt-frontend-jaxrs-2.7.10.jar:2.7.10]
at org.apache.cxf.jaxrs.client.WebClient.access$100(WebClient.java:80)
~[cxf-rt-frontend-jaxrs-2.7.10.jar:2.7.10]
at
org.apache.cxf.jaxrs.client.WebClient$ClientAsyncResponseInterceptor.handleMessage(WebClient.java:1265)
~[cxf-rt-frontend-jaxrs-2.7.10.jar:2.7.10]
at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
~[cxf-api-2.7.10.jar:2.7.10]
at
org.apache.cxf.jaxrs.client.ClientMessageObserver.onMessage(ClientMessageObserver.java:56)
~[cxf-rt-frontend-jaxrs-2.7.10.jar:2.7.10]
at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream$1.run(HTTPConduit.java:1138)
~[cxf-rt-transports-http-2.7.10_PATCH.jar:2.7.10.PATCH]
at
org.apache.cxf.workqueue.AutomaticWorkQueueImpl$3.run(AutomaticWorkQueueImpl.java:428)
~[cxf-api-2.7.10.jar:2.7.10]
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
~[na:1.7.0_25]
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
~[na:1.7.0_25]
at
org.apache.cxf.workqueue.AutomaticWorkQueueImpl$AWQThreadFactory$1.run(AutomaticWorkQueueImpl.java:353)
~[cxf-api-2.7.10.jar:2.7.10]
at java.lang.Thread.run(Thread.java:724) ~[na:1.7.0_25]
Caused by: javax.ws.rs.client.ClientException: java.lang.IllegalStateException:
IllegalStateException invoking
http://localhost:50324/geoloc?ip=10.1.1.2&lang=en: Already connected
at
org.apache.cxf.jaxrs.client.WebClient.handleAsyncResponse(WebClient.java:984)
~[cxf-rt-frontend-jaxrs-2.7.10.jar:2.7.10]
... 10 common frames omitted
Caused by: java.lang.IllegalStateException: IllegalStateException invoking
http://localhost:50324/geoloc?ip=10.1.1.2&lang=en: Already connected
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native
Method) ~[na:1.7.0_25]
at
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
~[na:1.7.0_25]
at
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
~[na:1.7.0_25]
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
~[na:1.7.0_25]
at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.mapException(HTTPConduit.java:1346)
~[cxf-rt-transports-http-2.7.10_PATCH.jar:2.7.10.PATCH]
at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1335)
~[cxf-rt-transports-http-2.7.10_PATCH.jar:2.7.10.PATCH]
at
org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
~[cxf-api-2.7.10.jar:2.7.10]
at
org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:628)
~[cxf-rt-transports-http-2.7.10_PATCH.jar:2.7.10.PATCH]
at
org.apache.cxf.endpoint.AbstractConduitSelector.complete(AbstractConduitSelector.java:185)
~[cxf-api-2.7.10.jar:2.7.10]
at
org.apache.cxf.jaxrs.client.AbstractClient.preProcessResult(AbstractClient.java:556)
~[cxf-rt-frontend-jaxrs-2.7.10.jar:2.7.10]
at
org.apache.cxf.jaxrs.client.WebClient.handleAsyncResponse(WebClient.java:979)
~[cxf-rt-frontend-jaxrs-2.7.10.jar:2.7.10]
... 10 common frames omitted
Caused by: java.lang.IllegalStateException: Already connected
at
sun.net.www.protocol.http.HttpURLConnection.setRequestProperty(HttpURLConnection.java:2748)
~[na:1.7.0_25]
at
org.apache.cxf.transport.http.Headers.setProtocolHeadersInConnection(Headers.java:273)
~[cxf-rt-transports-http-2.7.10_PATCH.jar:2.7.10.PATCH]
at
org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.setProtocolHeaders(URLConnectionHTTPConduit.java:213)
~[cxf-rt-transports-http-2.7.10_PATCH.jar:2.7.10.PATCH]
at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleHeadersTrustCaching(HTTPConduit.java:1267)
~[cxf-rt-transports-http-2.7.10_PATCH.jar:2.7.10.PATCH]
at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1306)
~[cxf-rt-transports-http-2.7.10_PATCH.jar:2.7.10.PATCH]
... 15 common frames omitted
This exception is due to the work done during the call of
handleHeadersTrustCaching() in HTTPConduit.
The following method are called :
1/
URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.setProtocolHeaders()
2/ Headers.setProtocolHeadersInConnection(HttpURLConnection connection)
This last method failed on the following line :
connection.setRequestProperty(HttpHeaderHelper.CONTENT_TYPE, ct);
because connection is in "socket timeout state".
What I have found is :
1/ The SocketTimeoutException is stored on connection field of :
org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream
2/ This type of connection field is : HttpURLConnection
3/ the exception SocketTimeout is stored in rememberedException
4/ The only way (except unprotecting this private field) in order to access
rememberedException is to call getInputStream which throw the
rememberedException if present
What could be done is to call getInputStream() just before calling
handleHeadersTrustCaching method, if an exception is thrown
handleHeadersTrustCaching will not be called. It's not a beautifull fix, but it
works for this case.
Another solution could be the storage of the SocketTimeoutException during the
processing of the request but it could have a bigger impact
You will find a patch for version 2.7.10 with the usage of getInputStream. The
following exception is thrown with the patch :
javax.ws.rs.client.ClientException:
javax.ws.rs.client.ClientException: java.net.SocketTimeoutException: Read timed
out
at
org.apache.cxf.jaxrs.client.JaxrsClientCallback.handleException(JaxrsClientCallback.java:90)
~[cxf-rt-frontend-jaxrs-2.7.10.jar:2.7.10]
at
org.apache.cxf.jaxrs.client.WebClient.handleAsyncResponse(WebClient.java:988)
~[cxf-rt-frontend-jaxrs-2.7.10.jar:2.7.10]
at org.apache.cxf.jaxrs.client.WebClient.access$100(WebClient.java:80)
~[cxf-rt-frontend-jaxrs-2.7.10.jar:2.7.10]
at
org.apache.cxf.jaxrs.client.WebClient$ClientAsyncResponseInterceptor.handleMessage(WebClient.java:1265)
~[cxf-rt-frontend-jaxrs-2.7.10.jar:2.7.10]
at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
~[cxf-api-2.7.10.jar:2.7.10]
at
org.apache.cxf.jaxrs.client.ClientMessageObserver.onMessage(ClientMessageObserver.java:56)
~[cxf-rt-frontend-jaxrs-2.7.10.jar:2.7.10]
at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream$1.run(HTTPConduit.java:1138)
~[cxf-rt-transports-http-2.7.10_PATCH.jar:2.7.10.PATCH]
at
org.apache.cxf.workqueue.AutomaticWorkQueueImpl$3.run(AutomaticWorkQueueImpl.java:428)
~[cxf-api-2.7.10.jar:2.7.10]
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
~[na:1.7.0_25]
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
~[na:1.7.0_25]
at
org.apache.cxf.workqueue.AutomaticWorkQueueImpl$AWQThreadFactory$1.run(AutomaticWorkQueueImpl.java:353)
~[cxf-api-2.7.10.jar:2.7.10]
at java.lang.Thread.run(Thread.java:724) ~[na:1.7.0_25]
Caused by: javax.ws.rs.client.ClientException: java.net.SocketTimeoutException:
Read timed out
at
org.apache.cxf.jaxrs.client.AbstractClient.checkClientException(AbstractClient.java:575)
~[cxf-rt-frontend-jaxrs-2.7.10.jar:2.7.10]
at
org.apache.cxf.jaxrs.client.AbstractClient.preProcessResult(AbstractClient.java:557)
~[cxf-rt-frontend-jaxrs-2.7.10.jar:2.7.10]
at
org.apache.cxf.jaxrs.client.WebClient.handleAsyncResponse(WebClient.java:979)
~[cxf-rt-frontend-jaxrs-2.7.10.jar:2.7.10]
... 10 common frames omitted
Caused by: java.net.SocketTimeoutException: Read timed out
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native
Method) ~[na:1.7.0_25]
at
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
~[na:1.7.0_25]
at
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
~[na:1.7.0_25]
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
~[na:1.7.0_25]
at
sun.net.www.protocol.http.HttpURLConnection$6.run(HttpURLConnection.java:1674)
~[na:1.7.0_25]
at
sun.net.www.protocol.http.HttpURLConnection$6.run(HttpURLConnection.java:1672)
~[na:1.7.0_25]
at java.security.AccessController.doPrivileged(Native Method)
~[na:1.7.0_25]
at
sun.net.www.protocol.http.HttpURLConnection.getChainedException(HttpURLConnection.java:1670)
~[na:1.7.0_25]
at
sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1243)
~[na:1.7.0_25]
at
java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:468)
~[na:1.7.0_25]
at
org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.getResponseCode(URLConnectionHTTPConduit.java:266)
~[cxf-rt-transports-http-2.7.10_PATCH.jar:2.7.10.PATCH]
at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1548)
~[cxf-rt-transports-http-2.7.10_PATCH.jar:2.7.10.PATCH]
at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream$1.run(HTTPConduit.java:1129)
~[cxf-rt-transports-http-2.7.10_PATCH.jar:2.7.10.PATCH]
... 5 common frames omitted
Caused by: java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method) ~[na:1.7.0_25]
at java.net.SocketInputStream.read(SocketInputStream.java:150)
~[na:1.7.0_25]
at java.net.SocketInputStream.read(SocketInputStream.java:121)
~[na:1.7.0_25]
at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
~[na:1.7.0_25]
at java.io.BufferedInputStream.read1(BufferedInputStream.java:275)
~[na:1.7.0_25]
at java.io.BufferedInputStream.read(BufferedInputStream.java:334)
~[na:1.7.0_25]
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:633)
~[na:1.7.0_25]
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:579)
~[na:1.7.0_25]
at
sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1322)
~[na:1.7.0_25]
at
java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:468)
~[na:1.7.0_25]
at
org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.getResponseCode(URLConnectionHTTPConduit.java:266)
~[cxf-rt-transports-http-2.7.10_PATCH.jar:2.7.10.PATCH]
at
org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.getInputStream(URLConnectionHTTPConduit.java:237)
~[cxf-rt-transports-http-2.7.10_PATCH.jar:2.7.10.PATCH]
at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1309)
~[cxf-rt-transports-http-2.7.10_PATCH.jar:2.7.10.PATCH]
at
org.apache.cxf.io.CacheAndWriteOutputStream.postClose(CacheAndWriteOutputStream.java:50)
~[cxf-api-2.7.10.jar:2.7.10]
at
org.apache.cxf.io.CachedOutputStream.close(CachedOutputStream.java:223)
~[cxf-api-2.7.10.jar:2.7.10]
at
org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
~[cxf-api-2.7.10.jar:2.7.10]
at
org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:628)
~[cxf-rt-transports-http-2.7.10_PATCH.jar:2.7.10.PATCH]
at
org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
~[cxf-api-2.7.10.jar:2.7.10]
at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
~[cxf-api-2.7.10.jar:2.7.10]
at
org.apache.cxf.jaxrs.client.AbstractClient.doRunInterceptorChain(AbstractClient.java:634)
~[cxf-rt-frontend-jaxrs-2.7.10.jar:2.7.10]
at
org.apache.cxf.jaxrs.client.WebClient.doInvokeAsync(WebClient.java:942)
~[cxf-rt-frontend-jaxrs-2.7.10.jar:2.7.10]
at
org.apache.cxf.jaxrs.client.WebClient.doInvokeAsyncCallback(WebClient.java:914)
~[cxf-rt-frontend-jaxrs-2.7.10.jar:2.7.10]
at
org.apache.cxf.jaxrs.client.WebClient$AsyncInvokerImpl.method(WebClient.java:1438)
~[cxf-rt-frontend-jaxrs-2.7.10.jar:2.7.10]
at
org.apache.cxf.jaxrs.client.WebClient$AsyncInvokerImpl.get(WebClient.java:1307)
~[cxf-rt-frontend-jaxrs-2.7.10.jar:2.7.10]
at
com.capgemini.common.ws.client.subsystem.AsyncService.executeGet(AsyncService.java:74)
~[classes/:na]
at
com.capgemini.opentv.enabler.geoloc.rest.client.GeolocUtils.getGeolocAsync(GeolocUtils.java:91)
~[classes/:na]
at
com.capgemini.opentv.mediation.mup.application.module.impl.async.GeolocAsyncRequestLauncher.launchAsyncTask(GeolocAsyncRequestLauncher.java:58)
~[classes/:na]
at
com.capgemini.common.async.AbstractAsyncWorkflow.nextStep(AbstractAsyncWorkflow.java:140)
~[classes/:na]
at
com.capgemini.common.async.WorkflowExecutor.run(WorkflowExecutor.java:44)
~[classes/:na]
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
~[na:1.7.0_25]
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
~[na:1.7.0_25]
... 1 common frames omitted
--
This message was sent by Atlassian JIRA
(v6.2#6252)