We got into troubles when upgrading from 5.7.0 to new version 5.10.0. One of our tests which uses binding of PooledConnectionFactory into JNDI (tomcat-naming) got stuck and computes in endless loop.
Problem is implementation of interface org.apache.activemq.jndi.JNDIStorableInterface in class org.apache.activemq.pool.PooledConnectionFactory:
- method populateProperties(Properties props) implementation uses IntrospectionSupport.getProperties(...) in order to set properties for all getters,
- setting properties works for basic types, but causes stack overflow for getters - getReference() and getProperties() which creates recursion loops
- loop #1: PooledConnectionFactory.getProperties -> PooledConnectionFactory.populateProperties -> IntrospectionSupport.getProperties -> PooledConnectionFactory.getProperties
- loop #2: PooledConnectionFactory.getProperties -> PooledConnectionFactory.populateProperties -> IntrospectionSupport.getProperties -> PooledConnectionFactory.getReference -> JNDIReferenceFactory.createReference -> PooledConnectionFactory.getProperties
- additional info: recursion loop doesn't end with StackOverflowError, but InvocationTargetException is propagated to IntrospectionSupport.getProperties method where it is being ignored and causes "almost endless" computation (exponential complexity)
Example test without using JNDI, but using key methods showing the problem and its possible solution/workaround for AMQ 5.10.0 is attached.
We found that error exists for AMQ 5.9.0 and newer after resolving following issue