[ 
https://issues.apache.org/jira/browse/CXF-3800?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Daniel Kulp resolved CXF-3800.
------------------------------

       Resolution: Duplicate
    Fix Version/s:     (was: NeedMoreInfo)
                   2.3.1

Using a new map per request for the response context is exactly what CXF-2992 
did so that should work.

> 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
>            Assignee: Daniel Kulp
>            Priority: Critical
>             Fix For: 2.3.1
>
>
> 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

        

Reply via email to