You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by dj...@apache.org on 2004/11/07 22:41:19 UTC

svn commit: rev 56866 - in geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction: . context manager

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;
     }
 
 }