Christoph Läubrich created CAMEL-10456:
------------------------------------------

             Summary: Camel leaks TCCL
                 Key: CAMEL-10456
                 URL: https://issues.apache.org/jira/browse/CAMEL-10456
             Project: Camel
          Issue Type: Bug
          Components: camel-core
            Reporter: Christoph Läubrich


Camel leaks ThreadContextClassLoader instances at least in the following place:

camel-core: 
https://github.com/apache/camel/blob/4f9448d83cc21a348f92cca961907b0f72d9db79/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java#L1913

As mentioned in the JavaDoc of Thread.getContextClassLoader() returning "null 
indicating the system class loader (or, failing that, the bootstrap class 
loader)", se same applies to Thread.setContextClassLoader(...)

The code only reset the TCCL if the returned value from 
Thread.currentThread().getContextClassLoader() was != null. So if in a thread 
without a TCCL set (and thus returning null) these methods set a new CCL but 
later do not reset these to the original null value.

This leads to Threads (e.g. when taking reused from a pool) having a 
classloader that will never gets reset and thus can't be garbage collected or 
even lead to strange behaviour because if other code that uses the 
TCCL-mechanism can try to load classes or resources from this loader later on.

I found that 
https://github.com/apache/camel/blob/master/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsProducer.java#L85
 uses a similar pattern, only resetting the TCCL if the *new* TCCL != null so 
maybe the code in ObjectHelper was meant to check for classloader != null 
instead of tccl !=null

The fix should also include making sure this pattern is not used in other 
camel-components or even to use the ObjectHelper Method consistently, currently 
it seems may components implement their owh TCCL-handling.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to