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