From scm-return-5561-apmail-geronimo-scm-archive=geronimo.apache.org@geronimo.apache.org Sun Nov 07 21:41:22 2004 Return-Path: Delivered-To: apmail-geronimo-scm-archive@www.apache.org Received: (qmail 1839 invoked from network); 7 Nov 2004 21:41:22 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur-2.apache.org with SMTP; 7 Nov 2004 21:41:22 -0000 Received: (qmail 26346 invoked by uid 500); 7 Nov 2004 21:41:21 -0000 Delivered-To: apmail-geronimo-scm-archive@geronimo.apache.org Received: (qmail 26328 invoked by uid 500); 7 Nov 2004 21:41:21 -0000 Mailing-List: contact scm-help@geronimo.apache.org; run by ezmlm Precedence: bulk list-help: list-unsubscribe: list-post: Reply-To: dev@geronimo.apache.org Delivered-To: mailing list scm@geronimo.apache.org Received: (qmail 26315 invoked by uid 99); 7 Nov 2004 21:41:21 -0000 X-ASF-Spam-Status: No, hits=-10.0 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from [209.237.227.194] (HELO minotaur.apache.org) (209.237.227.194) by apache.org (qpsmtpd/0.28) with SMTP; Sun, 07 Nov 2004 13:41:20 -0800 Received: (qmail 1823 invoked by uid 65534); 7 Nov 2004 21:41:19 -0000 Date: 7 Nov 2004 21:41:19 -0000 Message-ID: <20041107214119.1819.qmail@minotaur.apache.org> From: djencks@apache.org To: scm@geronimo.apache.org Subject: svn commit: rev 56866 - in geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction: . context manager X-Virus-Checked: Checked X-Spam-Rating: minotaur-2.apache.org 1.6.2 0/1000/N Author: djencks Date: Sun Nov 7 13:41:18 2004 New Revision: 56866 Modified: geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/OnlineUserTransaction.java geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/context/TransactionContextManager.java geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/manager/TransactionManagerImpl.java Log: final solution for GERONIMO-378. Make the setTransactionTimeout on UserTransaction and TransactionManager thread local. Make everything else work more sensibly Modified: geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/OnlineUserTransaction.java ============================================================================== --- geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/OnlineUserTransaction.java (original) +++ geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/OnlineUserTransaction.java Sun Nov 7 13:41:18 2004 @@ -19,7 +19,6 @@ public final class OnlineUserTransaction implements UserTransaction, Serializable { private transient TransactionContextManager transactionContextManager; private transient TrackedConnectionAssociator trackedConnectionAssociator; - private long transactionTimeoutMilliseconds = 0L; boolean isActive() { return transactionContextManager != null; @@ -43,11 +42,11 @@ if (seconds < 0) { throw new SystemException("transaction timeout must be positive or 0, not " + seconds); } - transactionTimeoutMilliseconds = seconds * 1000; + transactionContextManager.setTransactionTimeout(seconds); } public void begin() throws NotSupportedException, SystemException { - transactionContextManager.newBeanTransactionContext(transactionTimeoutMilliseconds); + transactionContextManager.newBeanTransactionContext(0L); if(trackedConnectionAssociator != null) { try { Modified: geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/context/TransactionContextManager.java ============================================================================== --- geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/context/TransactionContextManager.java (original) +++ geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/context/TransactionContextManager.java Sun Nov 7 13:41:18 2004 @@ -69,7 +69,11 @@ public TransactionManager getTransactionManager() { return transactionManager; } - + + public void setTransactionTimeout(int timeoutSeconds) throws SystemException { + transactionManager.setTransactionTimeout(timeoutSeconds); + } + public TransactionContext getContext() { return TransactionContext.getContext(); } @@ -121,8 +125,6 @@ /** - * TODO write and use ImportedTransactionContext for this! - * * @see javax.resource.spi.XATerminator#commit(javax.transaction.xa.Xid, boolean) */ public void commit(Xid xid, boolean onePhase) throws XAException { Modified: geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/manager/TransactionManagerImpl.java ============================================================================== --- geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/manager/TransactionManagerImpl.java (original) +++ geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/manager/TransactionManagerImpl.java Sun Nov 7 13:41:18 2004 @@ -26,16 +26,14 @@ import javax.transaction.Status; import javax.transaction.SystemException; import javax.transaction.Transaction; -import javax.transaction.TransactionManager; import javax.transaction.xa.XAException; import javax.transaction.xa.Xid; -import org.apache.geronimo.transaction.log.UnrecoverableLog; import org.apache.geronimo.transaction.ExtendedTransactionManager; +import org.apache.geronimo.transaction.log.UnrecoverableLog; /** * Simple implementation of a transaction manager. - * TODO transactionTimeoutMilliseconds functionality * TODO shut down timer gracefully * * @version $Rev$ $Date$ @@ -44,23 +42,21 @@ private final TransactionLog txnLog; private final XidFactory xidFactory; private final int defaultTransactionTimeoutMilliseconds; - private volatile int transactionTimeoutMilliseconds; + private final ThreadLocal transactionTimeoutMilliseconds = new ThreadLocal(); private final ThreadLocal threadTx = new ThreadLocal(); private final Timer timeoutTimer = new Timer(true); public TransactionManagerImpl() { defaultTransactionTimeoutMilliseconds = 10 * 1000; - transactionTimeoutMilliseconds = defaultTransactionTimeoutMilliseconds; txnLog = new UnrecoverableLog(); xidFactory = new XidFactoryImpl(); } - public TransactionManagerImpl(int defaultTransactionTimeoutSeconds, TransactionLog txnLog, XidFactory xidFactory) throws SystemException { + public TransactionManagerImpl(int defaultTransactionTimeoutSeconds, TransactionLog txnLog, XidFactory xidFactory) { if (defaultTransactionTimeoutSeconds <= 0) { throw new IllegalArgumentException("defaultTransactionTimeoutSeconds must be positive: attempted value: " + defaultTransactionTimeoutSeconds); } this.defaultTransactionTimeoutMilliseconds = defaultTransactionTimeoutSeconds * 1000; - setTransactionTimeout(defaultTransactionTimeoutSeconds); this.txnLog = txnLog; this.xidFactory = xidFactory; } @@ -74,9 +70,9 @@ throw new SystemException("transaction timeout must be positive or 0 to reset to default"); } if (seconds == 0) { - transactionTimeoutMilliseconds = defaultTransactionTimeoutMilliseconds; + transactionTimeoutMilliseconds.set(null); } else { - transactionTimeoutMilliseconds = seconds * 1000; + transactionTimeoutMilliseconds.set(new Long(seconds * 1000)); } } @@ -86,7 +82,7 @@ } public void begin() throws NotSupportedException, SystemException { - begin(transactionTimeoutMilliseconds); + begin(getTransactionTimeoutMilliseconds(0L)); } public Transaction begin(long transactionTimeoutMilliseconds) throws NotSupportedException, SystemException { @@ -94,7 +90,7 @@ throw new NotSupportedException("Nested Transactions are not supported"); } TransactionImpl tx = new TransactionImpl(xidFactory, txnLog); - timeoutTimer.schedule(tx, transactionTimeoutMilliseconds == 0? this.transactionTimeoutMilliseconds: transactionTimeoutMilliseconds); + timeoutTimer.schedule(tx, getTransactionTimeoutMilliseconds(transactionTimeoutMilliseconds)); threadTx.set(tx); ((TransactionImpl)tx).setCurrentThread(Thread.currentThread()); return tx; @@ -156,11 +152,11 @@ //XidImporter implementation public Transaction importXid(Xid xid, long transactionTimeoutMilliseconds) throws XAException, SystemException { - TransactionImpl tx = new TransactionImpl(xid, xidFactory, txnLog); - if (transactionTimeoutMilliseconds == 0) { - transactionTimeoutMilliseconds = this.transactionTimeoutMilliseconds; + if (transactionTimeoutMilliseconds < 0) { + throw new SystemException("transaction timeout must be positive or 0 to reset to default"); } - timeoutTimer.schedule(tx, transactionTimeoutMilliseconds); + TransactionImpl tx = new TransactionImpl(xid, xidFactory, txnLog); + timeoutTimer.schedule(tx, getTransactionTimeoutMilliseconds(transactionTimeoutMilliseconds)); return tx; } @@ -210,6 +206,17 @@ } catch (SystemException e) { throw (XAException) new XAException().initCause(e); } + } + + private long getTransactionTimeoutMilliseconds(long transactionTimeoutMilliseconds) { + if (transactionTimeoutMilliseconds != 0) { + return transactionTimeoutMilliseconds; + } + Long timeout = (Long) this.transactionTimeoutMilliseconds.get(); + if (timeout != null) { + return timeout.longValue(); + } + return defaultTransactionTimeoutMilliseconds; } }