ClientImpl reuse ResponseContext cause ConcurrentModificationException
----------------------------------------------------------------------
Key: CXF-3800
URL: https://issues.apache.org/jira/browse/CXF-3800
Project: CXF
Issue Type: Bug
Components: Core
Reporter: David Liu
Priority: Critical
In org.apache.cxf.endpoint.ClientImpl.invoke() method, it reuses the existing
ResponseContext of current thread from its WeakHashMap. It can cause the
ConcurrentModificationException if the proxy client use an Executor to execute
an asyc request.
Thread 1. We call the async request method of generated proxy client, it will
call JaxWsClientProxy.invokeAsync(), and it will get the previous
ResponseContext of current thread and clear it and reuse it in ClientImpl.
{code}
ClientImpl:
if (context == null) {
context = new HashMap<String, Object>();
Map<String, Object> resp = getResponseContext();
resp.clear();
{code}
Thread 2, When CXF got the response from the server, it will use a background
thread to process the response, and also it will get the ResponseContext and
process the response in ClientImpl
{code}
ClientImpl.onMessage(){
message.getExchange().setInMessage(message);
Map<String, Object> resCtx = CastUtils.cast((Map<?,
?>)message.getExchange().getOutMessage().get(Message.INVOCATION_CONTEXT));
// *** Get Response context which could be clean by Thread1 ***
resCtx = CastUtils.cast((Map<?, ?>)resCtx.get(RESPONSE_CONTEXT));
try {
Object obj[] = processResult(message, message.getExchange(),null,
resCtx);
}
{code}
Since the ResponseContext in Thread 2 could be clean by the Thread 1 during
processing the response message, so it could cause
ConcurrentModificationException, or it can cause data error.
Could you please fix it by creating a new ResponseContext for the new
request? thanks.
David
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira