You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cxf.apache.org by "Anthony Communier (JIRA)" <ji...@apache.org> on 2014/03/04 19:31:20 UTC
[jira] [Comment Edited] (CXF-5590) On socket timeout an
IllegalStateException is thrown
[ https://issues.apache.org/jira/browse/CXF-5590?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13919737#comment-13919737 ]
Anthony Communier edited comment on CXF-5590 at 3/4/14 6:29 PM:
----------------------------------------------------------------
Patch for version 2.7.10.
Find a better way to know if exception was thrown. No more usage of getInputStream() that have side effect
was (Author: anthonyc):
Patch for version 2.7.10
> 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
> Attachments: HTTPConduit.java.patch
>
>
> 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)