Repository: tomee Updated Branches: refs/heads/tomee-1.7.x 70ac3f9ce -> dd0614976
Add lock Project: http://git-wip-us.apache.org/repos/asf/tomee/repo Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/dd061497 Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/dd061497 Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/dd061497 Branch: refs/heads/tomee-1.7.x Commit: dd0614976de2e079fd253f2bcbcc58f3313b2fa6 Parents: 70ac3f9 Author: AndyGee <andy...@gmx.de> Authored: Fri Nov 20 17:07:50 2015 +0100 Committer: AndyGee <andy...@gmx.de> Committed: Fri Nov 20 17:07:50 2015 +0100 ---------------------------------------------------------------------- .../core/transaction/JtaTransactionPolicy.java | 7 ++- .../activemq/ConnectionFactoryWrapper.java | 49 ++++++++++++------ .../resource/activemq/ConnectionWrapper.java | 54 +++++++++++++------- pom.xml | 2 +- 4 files changed, 75 insertions(+), 37 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tomee/blob/dd061497/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/JtaTransactionPolicy.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/JtaTransactionPolicy.java b/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/JtaTransactionPolicy.java index b51e79c..e744852 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/JtaTransactionPolicy.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/JtaTransactionPolicy.java @@ -133,7 +133,12 @@ public abstract class JtaTransactionPolicy implements TransactionPolicy { @Override public void putResource(final Object key, final Object value) { if (isTransactionActive()) { - this.getSynchronizationRegistry().putResource(key, value); + final TransactionSynchronizationRegistry sr = this.getSynchronizationRegistry(); + if (null != sr) { + sr.putResource(key, value); + } else { + logger.warning("TransactionSynchronizationRegistry has not been initialized"); + } } if (resources == null) { http://git-wip-us.apache.org/repos/asf/tomee/blob/dd061497/container/openejb-core/src/main/java/org/apache/openejb/resource/activemq/ConnectionFactoryWrapper.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/resource/activemq/ConnectionFactoryWrapper.java b/container/openejb-core/src/main/java/org/apache/openejb/resource/activemq/ConnectionFactoryWrapper.java index 0e94c1d..6e024e9 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/resource/activemq/ConnectionFactoryWrapper.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/resource/activemq/ConnectionFactoryWrapper.java @@ -19,11 +19,13 @@ import javax.jms.TopicConnection; import javax.jms.TopicConnectionFactory; import java.util.ArrayList; import java.util.Iterator; +import java.util.concurrent.locks.ReentrantLock; import java.util.logging.Level; import java.util.logging.Logger; public class ConnectionFactoryWrapper implements ConnectionFactory, TopicConnectionFactory, QueueConnectionFactory { + private static final ReentrantLock lock = new ReentrantLock(); private static final ArrayList<ConnectionWrapper> connections = new ArrayList<ConnectionWrapper>(); private final org.apache.activemq.ra.ActiveMQConnectionFactory factory; @@ -45,30 +47,45 @@ public class ConnectionFactoryWrapper implements ConnectionFactory, TopicConnect } private static Connection getConnection(final String name, final Connection connection) { - final ConnectionWrapper wrapper = new ConnectionWrapper(name, connection); - connections.add(wrapper); - return wrapper; + lock.lock(); + try { + final ConnectionWrapper wrapper = new ConnectionWrapper(name, connection); + connections.add(wrapper); + return wrapper; + } finally { + lock.unlock(); + } } protected static void remove(final ConnectionWrapper connectionWrapper) { - connections.remove(connectionWrapper); + lock.lock(); + try { + connections.remove(connectionWrapper); + } finally { + lock.unlock(); + } } public static void closeConnections() { - final Iterator<ConnectionWrapper> iterator = connections.iterator(); + lock.lock(); + try { + final Iterator<ConnectionWrapper> iterator = connections.iterator(); - ConnectionWrapper next; - while (iterator.hasNext()) { - next = iterator.next(); - iterator.remove(); - try { - next.close(); - } catch (final Exception e) { - //no-op - } finally { - Logger.getLogger(ConnectionFactoryWrapper.class.getName()).log(Level.SEVERE, "Closed a JMS connection. You have an application that fails to close a connection " - + "created by this injection path: " + next.getName()); + ConnectionWrapper next; + while (iterator.hasNext()) { + next = iterator.next(); + iterator.remove(); + try { + next.close(); + } catch (final Exception e) { + //no-op + } finally { + Logger.getLogger(ConnectionFactoryWrapper.class.getName()).log(Level.SEVERE, "Closed a JMS connection. You have an application that fails to close a connection " + + "created by this injection path: " + next.getName()); + } } + } finally { + lock.unlock(); } } http://git-wip-us.apache.org/repos/asf/tomee/blob/dd061497/container/openejb-core/src/main/java/org/apache/openejb/resource/activemq/ConnectionWrapper.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/resource/activemq/ConnectionWrapper.java b/container/openejb-core/src/main/java/org/apache/openejb/resource/activemq/ConnectionWrapper.java index 707e9bd..fe86874 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/resource/activemq/ConnectionWrapper.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/resource/activemq/ConnectionWrapper.java @@ -26,11 +26,13 @@ import javax.jms.TopicConnection; import javax.jms.TopicSession; import java.util.ArrayList; import java.util.Iterator; +import java.util.concurrent.locks.ReentrantLock; import java.util.logging.Level; import java.util.logging.Logger; public class ConnectionWrapper implements Connection, TopicConnection, QueueConnection { + private final ReentrantLock lock = new ReentrantLock(); private final ArrayList<SessionWrapper> sessions = new ArrayList<SessionWrapper>(); private final String name; @@ -47,13 +49,23 @@ public class ConnectionWrapper implements Connection, TopicConnection, QueueConn } private Session getSession(final Session session) { - final SessionWrapper wrapper = new SessionWrapper(this, session); - sessions.add(wrapper); - return wrapper; + lock.lock(); + try { + final SessionWrapper wrapper = new SessionWrapper(this, session); + sessions.add(wrapper); + return wrapper; + } finally { + lock.unlock(); + } } protected void remove(final SessionWrapper wrapper) { - sessions.remove(wrapper); + lock.lock(); + try { + sessions.remove(wrapper); + } finally { + lock.unlock(); + } } @Override @@ -108,26 +120,30 @@ public class ConnectionWrapper implements Connection, TopicConnection, QueueConn @Override public void close() throws JMSException { + lock.lock(); + try { + final Iterator<SessionWrapper> iterator = sessions.iterator(); + + while (iterator.hasNext()) { + final SessionWrapper next = iterator.next(); + iterator.remove(); + try { + next.close(); + } catch (final Exception e) { + //no-op + } finally { + Logger.getLogger(ConnectionFactoryWrapper.class.getName()).log(Level.SEVERE, "Closed a JMS session. You have an application that fails to close a session " + + "created by this injection path: " + this.name); + } + } - final Iterator<SessionWrapper> iterator = sessions.iterator(); - - while (iterator.hasNext()) { - final SessionWrapper next = iterator.next(); - iterator.remove(); try { - next.close(); - } catch (final Exception e) { - //no-op + con.close(); } finally { - Logger.getLogger(ConnectionFactoryWrapper.class.getName()).log(Level.SEVERE, "Closed a JMS session. You have an application that fails to close a session " - + "created by this injection path: " + this.name); + ConnectionFactoryWrapper.remove(this); } - } - - try { - con.close(); } finally { - ConnectionFactoryWrapper.remove(this); + lock.unlock(); } } http://git-wip-us.apache.org/repos/asf/tomee/blob/dd061497/pom.xml ---------------------------------------------------------------------- diff --git a/pom.xml b/pom.xml index 7ec8339..6ae0220 100644 --- a/pom.xml +++ b/pom.xml @@ -237,7 +237,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> - <version>3.2</version> + <version>3.3</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId>