[jboss-cvs] JBossAS SVN: r111510 - in projects/jboss-jca/trunk/core/src: main/java/org/jboss/jca/core/connectionmanager/pool/mcp and 4 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Thu Jun 2 10:43:32 EDT 2011
Author: jesper.pedersen
Date: 2011-06-02 10:43:29 -0400 (Thu, 02 Jun 2011)
New Revision: 111510
Removed:
projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/transaction/TransactionKey.java
Modified:
projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/AbstractPool.java
projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/mcp/ManagedConnectionPoolFactory.java
projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/tx/TxConnectionManagerImpl.java
projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/common/MockManagedConnection.java
projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/tx/TxConnectionManagerTestCase.java
Log:
[JBJCA-593] Wrong ConnectionListener used when multiple MCPs active
Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/AbstractPool.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/AbstractPool.java 2011-06-02 14:20:39 UTC (rev 111509)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/AbstractPool.java 2011-06-02 14:43:29 UTC (rev 111510)
@@ -30,7 +30,6 @@
import org.jboss.jca.core.connectionmanager.pool.mcp.ManagedConnectionPool;
import org.jboss.jca.core.connectionmanager.pool.mcp.ManagedConnectionPoolFactory;
import org.jboss.jca.core.connectionmanager.transaction.LockKey;
-import org.jboss.jca.core.connectionmanager.transaction.TransactionKey;
import org.jboss.jca.core.spi.transaction.TransactionIntegration;
import java.util.HashSet;
@@ -346,9 +345,9 @@
// Are we doing track by transaction ?
TransactionSynchronizationRegistry tsr = getTransactionSynchronizationRegistry();
- Object trackByTx = tsr != null ? tsr.getTransactionKey() : null;
+ Object transactionKey = tsr != null ? tsr.getTransactionKey() : null;
- if (trackByTransaction == null || trackByTx == null)
+ if (trackByTransaction == null || transactionKey == null)
{
return getSimpleConnection(subject, cri, mcp);
}
@@ -356,7 +355,7 @@
// Transaction old connections
if (cl == null)
{
- cl = getTransactionOldConnection(trackByTransaction);
+ cl = getTransactionOldConnection(trackByTransaction, mcp);
}
// Creates a new connection with given transaction
@@ -421,10 +420,11 @@
* This method is package protected beacause it is intended only for test case use.
* Please don't use it in your production code.
* @param trackByTransaction transaction instance
+ * @param mcp the managed connection pool associated with the desired connection listener
* @return connection listener instance
* @throws ResourceException Thrown if an error occurs
*/
- ConnectionListener getTransactionOldConnection(Transaction trackByTransaction)
+ ConnectionListener getTransactionOldConnection(Transaction trackByTransaction, ManagedConnectionPool mcp)
throws ResourceException
{
TransactionSynchronizationRegistry tsr = getTransactionSynchronizationRegistry();
@@ -441,7 +441,7 @@
try
{
// Already got one
- ConnectionListener cl = (ConnectionListener)tsr.getResource(new TransactionKey(trackByTransaction));
+ ConnectionListener cl = (ConnectionListener)tsr.getResource(mcp);
if (cl != null)
{
log.tracef("Previous connection tracked by transaction=%s tx=%s", cl, trackByTransaction);
@@ -494,7 +494,7 @@
{
// Check we weren't racing with another transaction
ConnectionListener other =
- (ConnectionListener)tsr.getResource(new TransactionKey(trackByTransaction));
+ (ConnectionListener)tsr.getResource(mcp);
if (other != null)
{
@@ -508,7 +508,7 @@
// This is the connection for this transaction
cl.setTrackByTx(true);
- tsr.putResource(new TransactionKey(trackByTransaction), cl);
+ tsr.putResource(mcp, cl);
log.tracef("Using connection from pool tracked by transaction=%s tx=%s", cl, trackByTransaction);
Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/mcp/ManagedConnectionPoolFactory.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/mcp/ManagedConnectionPoolFactory.java 2011-06-02 14:20:39 UTC (rev 111509)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/mcp/ManagedConnectionPoolFactory.java 2011-06-02 14:43:29 UTC (rev 111510)
@@ -30,8 +30,6 @@
import javax.resource.spi.ManagedConnectionFactory;
import javax.security.auth.Subject;
-import org.jboss.logging.Logger;
-
/**
* Factory to create a managed connection pool
*
Deleted: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/transaction/TransactionKey.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/transaction/TransactionKey.java 2011-06-02 14:20:39 UTC (rev 111509)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/transaction/TransactionKey.java 2011-06-02 14:43:29 UTC (rev 111510)
@@ -1,69 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2011, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.jca.core.connectionmanager.transaction;
-
-import javax.transaction.Transaction;
-
-/**
- * Defines a transaction key
- *
- * @author <a href="mailto:jesper.pedersen at jboss.org">Jesper Pedersen</a>
- */
-public class TransactionKey
-{
- private Transaction tx;
-
- /**
- * Constructor
- * @param tx The transaction
- */
- public TransactionKey(Transaction tx)
- {
- this.tx = tx;
- }
-
- /**
- * Equals
- * @param other The other object
- * @return True if equal; otherwise false
- */
- public boolean equals(Object other)
- {
- if (this == other)
- return true;
-
- if (other == null || !(other instanceof TransactionKey))
- return false;
-
- TransactionKey tk = (TransactionKey)other;
- return tx.equals(tk.tx);
- }
-
- /**
- * Hash code
- * @return The value
- */
- public int hashCode()
- {
- return tx.hashCode();
- }
-}
Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/tx/TxConnectionManagerImpl.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/tx/TxConnectionManagerImpl.java 2011-06-02 14:20:39 UTC (rev 111509)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/tx/TxConnectionManagerImpl.java 2011-06-02 14:43:29 UTC (rev 111510)
@@ -29,7 +29,6 @@
import org.jboss.jca.core.connectionmanager.listener.TxConnectionListener;
import org.jboss.jca.core.connectionmanager.pool.mcp.ManagedConnectionPool;
import org.jboss.jca.core.connectionmanager.transaction.LockKey;
-import org.jboss.jca.core.connectionmanager.transaction.TransactionKey;
import org.jboss.jca.core.spi.transaction.TransactionIntegration;
import org.jboss.jca.core.spi.transaction.TransactionTimeoutConfiguration;
import org.jboss.jca.core.spi.transaction.TxUtils;
@@ -399,7 +398,7 @@
try
{
- transactionSynchronizationRegistry.putResource(new TransactionKey(tx), cl);
+ transactionSynchronizationRegistry.putResource(mcp, cl);
}
finally
{
Modified: projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/common/MockManagedConnection.java
===================================================================
--- projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/common/MockManagedConnection.java 2011-06-02 14:20:39 UTC (rev 111509)
+++ projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/common/MockManagedConnection.java 2011-06-02 14:43:29 UTC (rev 111510)
@@ -43,15 +43,18 @@
*/
public class MockManagedConnection implements ManagedConnection
{
- private int cleanUpCalled = 0;
+ private int cleanUpCalled;
private Set<ConnectionEventListener> listeners;
+ private MockHandle handle;
/**
* Creates a new instance.
*/
public MockManagedConnection()
{
+ this.cleanUpCalled = 0;
this.listeners = new HashSet<ConnectionEventListener>();
+ this.handle = new MockHandle();
}
/**
@@ -90,10 +93,9 @@
/**
* {@inheritDoc}
*/
-
public Object getConnection(Subject subject, ConnectionRequestInfo cxRequestInfo) throws ResourceException
{
- return new MockHandle();
+ return handle;
}
/**
Modified: projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/tx/TxConnectionManagerTestCase.java
===================================================================
--- projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/tx/TxConnectionManagerTestCase.java 2011-06-02 14:20:39 UTC (rev 111509)
+++ projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/tx/TxConnectionManagerTestCase.java 2011-06-02 14:43:29 UTC (rev 111510)
@@ -22,7 +22,6 @@
package org.jboss.jca.core.connectionmanager.tx;
import org.jboss.jca.common.api.metadata.common.FlushStrategy;
-import org.jboss.jca.core.api.connectionmanager.ConnectionManager;
import org.jboss.jca.core.api.connectionmanager.pool.PoolConfiguration;
import org.jboss.jca.core.connectionmanager.ConnectionManagerFactory;
import org.jboss.jca.core.connectionmanager.TxConnectionManager;
@@ -54,6 +53,8 @@
import static org.hamcrest.core.IsInstanceOf.instanceOf;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
@@ -98,8 +99,118 @@
throw e;
}
}
+
+
+ /**
+ * testSuccessiveAllocateConnectionRequestsInTheSameTransactionReturnTheSameConnection
+ * @throws Throwable for exception
+ */
+ @Test
+ public void testSuccessiveAllocateConnectionRequestsInTheSameTransactionReturnTheSameConnection() throws Throwable
+ {
+ TransactionManager transactionManager = txConnectionManager.getTransactionIntegration().getTransactionManager();
+ assertNotNull(transactionManager);
+ try
+ {
+ transactionManager.begin();
+
+ Object handle1 = txConnectionManager.allocateConnection(mcf, new MockConnectionRequestInfo());
+ Object handle2 = txConnectionManager.allocateConnection(mcf, new MockConnectionRequestInfo());
+
+ assertSame(handle1, handle2);
+
+ transactionManager.commit();
+ }
+ catch (Throwable e)
+ {
+ transactionManager.rollback();
+ throw e;
+ }
+ }
+
+
/**
+ * testSuccessiveAllocateConnectionRequestsInDifferentTransactionsReturnDifferentConnections
+ * @throws Throwable for exception
+ */
+ @Test
+ public void testSuccessiveAllocateConnectionRequestsInDifferentTransactionsReturnDifferentConnections()
+ throws Throwable
+ {
+ TransactionManager transactionManager = txConnectionManager.getTransactionIntegration().getTransactionManager();
+
+ assertNotNull(transactionManager);
+ Object handle1;
+ Object handle2;
+ try
+ {
+ transactionManager.begin();
+
+ handle1 = txConnectionManager.allocateConnection(mcf, new MockConnectionRequestInfo());
+
+ transactionManager.commit();
+ }
+ catch (Throwable e)
+ {
+ transactionManager.rollback();
+ throw e;
+ }
+
+ try
+ {
+ transactionManager.begin();
+
+ handle2 = txConnectionManager.allocateConnection(mcf, new MockConnectionRequestInfo());
+
+ transactionManager.commit();
+ }
+ catch (Throwable e)
+ {
+ transactionManager.rollback();
+ throw e;
+ }
+
+ assertNotSame(handle1, handle2);
+ }
+
+ /**
+ * testAllocateConnectionRequestsToDifferntConnectionManagrsInTheSameTransactionReturnDifferentConnections
+ * @throws Throwable for exception
+ */
+ @Test
+ public void testAllocateConnectionRequestsToDifferntConnectionManagrsInTheSameTransactionReturnDifferentConnections()
+ throws Throwable
+ {
+ TransactionManager transactionManager = txConnectionManager.getTransactionIntegration().getTransactionManager();
+
+ TxConnectionManager txConnectionManager1 = txConnectionManager;
+ ManagedConnectionFactory mcf1 = mcf;
+
+ ManagedConnectionFactory mcf2 = new MockManagedConnectionFactory();
+ TxConnectionManager txConnectionManager2 = buildTxConnectionManager(mcf2);
+
+ assertNotNull(transactionManager);
+ try
+ {
+ transactionManager.begin();
+
+ Object handle1 = txConnectionManager1.allocateConnection(mcf1, new MockConnectionRequestInfo());
+ Object handle2 = txConnectionManager2.allocateConnection(mcf2, new MockConnectionRequestInfo());
+
+ assertNotSame(handle1, handle2);
+
+ transactionManager.commit();
+ }
+ catch (Throwable e)
+ {
+ transactionManager.rollback();
+ throw e;
+ }
+
+ }
+
+ /**
* testGetTimeLeftBeforeTrsTimeout.
* @throws Throwable for exception
*/
@@ -304,22 +415,25 @@
embedded.deploy(naming);
embedded.deploy(transaction);
+
+ mcf = new MockManagedConnectionFactory();
+ txConnectionManager = buildTxConnectionManager(mcf);
+ }
+
+ private static TxConnectionManager buildTxConnectionManager(ManagedConnectionFactory mcf) throws Throwable
+ {
TransactionIntegration ti = embedded.lookup("TransactionIntegration", TransactionIntegration.class);
assertNotNull(ti);
-
- mcf = new MockManagedConnectionFactory();
+
PoolConfiguration pc = new PoolConfiguration();
PoolFactory pf = new PoolFactory();
-
+
Pool pool = pf.create(PoolStrategy.ONE_POOL, mcf, pc, true);
-
+
ConnectionManagerFactory cmf = new ConnectionManagerFactory();
- ConnectionManager connectionManager =
- cmf.createTransactional(TransactionSupportLevel.LocalTransaction, pool,
- null, null, false, null, FlushStrategy.FAILING_CONNECTION_ONLY,
- null, null, ti, null, null, null, null, null);
-
- txConnectionManager = (TxConnectionManager) connectionManager;
+ return (TxConnectionManager) cmf.createTransactional(TransactionSupportLevel.XATransaction, pool,
+ null, null, false, null, FlushStrategy.FAILING_CONNECTION_ONLY,
+ null, null, ti, null, null, null, null, null);
}
/**
More information about the jboss-cvs-commits
mailing list