Access to ConnectionPool.createSession needs to be synchronized 
----------------------------------------------------------------

                 Key: AMQ-3506
                 URL: https://issues.apache.org/jira/browse/AMQ-3506
             Project: ActiveMQ
          Issue Type: Bug
          Components: Broker
    Affects Versions: 5.5.0
         Environment: activemq-pool, PooledConnectionFactory with 
maximumActive=1 and blockIfSessionPoolIsFull=true (default behavior)
            Reporter: Torsten Mielke
             Fix For: 5.6.0


When configuring a PooledConnectionFactory with maximumActive=1 and 
blockIfSessionPoolIsFull=true (default behavior for latter config) it is 
possible that multiple threads that concurrently try to use the same JMS 
connection to create a new session might create more sessions than the 
configured maximumActive limit.

That's because the call to ConnectionPool.createSession() is not synchronized 
and if multiple threads try to call this method concurrently (on the same 
underlying JMS connection) then the if-condition in 
{code:java}
SessionKey key = new SessionKey(transacted, ackMode);
SessionPool pool = cache.get(key);
if (pool == null) {
  pool = createSessionPool(key);
  cache.put(key, pool);
}
{code}

will evaluate to true for *all* threads and they all end up creating their own 
sessionPool using the same SessionKey properties. 
Access to the if-condition needs to be synchronized so that only one session 
pool gets created. That will ensure that not more than the configured 
maximumActive number of sessions can get created. 

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to