-
Bug
-
Resolution: Done
-
Major
-
3.1.3.Final
-
None
Under high load with many parallel client requests we get the following exception:
Caused by: java.lang.NullPointerException
at org.apache.http.message.HeaderGroup.getHeaders(HeaderGroup.java:184)
at org.apache.http.message.AbstractHttpMessage.getHeaders(AbstractHttpMessage.java:75)
at org.apache.http.impl.client.DefaultClientConnectionReuseStrategy.keepAlive(DefaultClientConnectionReuseStrategy.java:51)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:274)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:55)
at org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine.invoke(ApacheHttpClient4Engine.java:283)
We found the problem in the none-thread-safe usage of the httpContext in ApacheHttpClient4Engine.
ApacheHttpClient4Engine keeps the httpContext as member variable and uses the same context for each execution
of the HttpClient.
The HttpClient uses the httpContext to store and transport temporary request parameters:
see:
org.apache.http.impl.execchain.ProtocolExec#execute() stores HttpCoreContext.HTTP_REQUEST
org.apache.http.impl.client.DefaultClientConnectionReuseStrategy#keepAlive() retrieves HttpCoreContext.HTTP_REQUEST
Under high load two threads working with the same request instance and this causes to the exception above.
Our workaround:
We wrapped the HttpClient and cloned the httpContext for each invocation of execute().
There was already a ticket for this problem: RESTEASY-906.
But it was closed without fixing.
- is duplicated by
-
RESTEASY-906 httpContext in ApacheHttpClient4Executor might not be thread safe
- Closed