activemq-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Torsten Mielke (JIRA)" <>
Subject [jira] [Commented] (AMQ-3506) Access to ConnectionPool.createSession needs to be synchronized
Date Wed, 21 Sep 2011 08:31:09 GMT


Torsten Mielke commented on AMQ-3506:

Claudio's suggestion should also work (using newPool.close() to discard the pool). I tested
it against the JUnit tests of activemq-pool and against a Camel route that consumes from JMS.
It has the advantage that once the cache contains a pool object, there is no additional overhead.
All overhead is only in the case when the cache does not yet contain the key.
In my solution there is a synchronized call for every createSession() invocation.

> Access to ConnectionPool.createSession needs to be synchronized 
> ----------------------------------------------------------------
>                 Key: AMQ-3506
>                 URL:
>             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
>              Labels: activemq-pool, maximumActive, sessionPool
>             Fix For: 5.6.0
>         Attachments: AMQ-3506.patch
>   Original Estimate: 3h
>  Remaining Estimate: 3h
> 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:


View raw message