org.apache.cxf.transport.http.finalizeConfig()  duplicate property listener and 
possible memory leak
----------------------------------------------------------------------------------------------------

                 Key: CXF-4131
                 URL: https://issues.apache.org/jira/browse/CXF-4131
             Project: CXF
          Issue Type: Bug
          Components: Transports
    Affects Versions: 2.5.2, 2.4.6
            Reporter: Louis-Rene Poirier Beauchemin
             Fix For: NeedMoreInfo


org.apache.cxf.transport.http.finalizeConfig() calling two times 
client.addPropertyChangeListener(this) resulting in duplicated 
PropertyChangeListener entry in the HTTPClientPolicy.propertyListener field.
First instance added is here:
{noformat} Thread [main] (Suspended (breakpoint at line 859 in 
org.apache.cxf.transport.http.HTTPConduit))     
     
org.apache.cxf.transport.http.HTTPConduit.setClient(org.apache.cxf.transports.http.configuration.HTTPClientPolicy)
 line: 859     
     
org.apache.cxf.transport.http.HTTPConduit.configureConduitFromEndpointInfo(org.apache.cxf.transport.http.HTTPConduit,
 org.apache.cxf.service.model.EndpointInfo) line: 334     
     org.apache.cxf.transport.http.HTTPConduit.finalizeConfig() line: 413     
     
org.apache.cxf.transport.http.HTTPTransportFactory.getConduit(org.apache.cxf.service.model.EndpointInfo,
 org.apache.cxf.ws.addressing.EndpointReferenceType) line: 253     
{noformat} 
The second one is here:
{noformat} 
Thread [main] (Suspended)     
     org.apache.cxf.transport.http.HTTPConduit.finalizeConfig() line: 421     
     
org.apache.cxf.transport.http.HTTPTransportFactory.getConduit(org.apache.cxf.service.model.EndpointInfo,
 org.apache.cxf.ws.addressing.EndpointReferenceType) line: 253 
{noformat} 

This problem seem to had been introduced when we upgraded to version 2.5.2 from 
version 2.3.2


Because we implemented a custom ConduitSelector and reuse the Conduit instance, 
this generated a memory leak from HTTPClientPolicy.propertyListener.
The work around we currently use to clean the extra instances is by reflection.
We use reflection to know how much duplicate instances there is in 
HTTPClientPolicy.propertyListener because there is no public api to access the 
array.
We then call HTTPClientPolicy.removePropertyChangeListener(listener) multiple 
time with the same instance to remove all of them as in the following snipplet 
from our implementation of ConduitSelector.complete() :
{noformat} 
 PropertyChangeListener listener = (PropertyChangeListener) selectedConduit;
                        List<HTTPClientPolicy> policies =
                            
pExchange.getEndpoint().getEndpointInfo().getExtensors(
                                HTTPClientPolicy.class);
                        for (HTTPClientPolicy policy : policies)
                        {
                            long nbListener = 
CxfReflectionInstrospectorUtil.getListenerNb(policy, listener);
                            while (nbListener > 0)
                            {
                                policy.removePropertyChangeListener(listener);
                                --nbListener;
                            }
                        }
{noformat} 


regards and many thanks for your efforts,
Louis-Rene Poirier Beauchemin.


--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        
  • [jira] [Created] (CXF-4131)... Louis-Rene Poirier Beauchemin (Created) (JIRA)

Reply via email to