You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2013/04/29 07:58:00 UTC

svn commit: r1476896 - in /tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb: core/SimpleTransactionSynchronizationRegistry.java resource/jdbc/router/FailOverRouter.java

Author: rmannibucau
Date: Mon Apr 29 05:57:59 2013
New Revision: 1476896

URL: http://svn.apache.org/r1476896
Log:
using TransactionSyncRegistry instead of a plain old map - Thanks David

Modified:
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/SimpleTransactionSynchronizationRegistry.java
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/router/FailOverRouter.java

Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/SimpleTransactionSynchronizationRegistry.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/SimpleTransactionSynchronizationRegistry.java?rev=1476896&r1=1476895&r2=1476896&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/SimpleTransactionSynchronizationRegistry.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/SimpleTransactionSynchronizationRegistry.java Mon Apr 29 05:57:59 2013
@@ -41,16 +41,13 @@ public class SimpleTransactionSynchroniz
         }
     }
 
-    public Object getResource(Object key) {
-        Transaction transaction = getActiveTransaction();
-
-        Map<Object, Object> resources = transactionResources.get(transaction);
+    public Object getResource(final Object key) {
+        final Transaction transaction = getActiveTransaction();
+        final Map<Object, Object> resources = transactionResources.get(transaction);
         if (resources == null) {
             return null;
         }
-
-        Object value = resources.get(key);
-        return value;
+        return resources.get(key);
     }
 
     public void putResource(Object key, Object value) {

Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/router/FailOverRouter.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/router/FailOverRouter.java?rev=1476896&r1=1476895&r2=1476896&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/router/FailOverRouter.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/router/FailOverRouter.java Mon Apr 29 05:57:59 2013
@@ -17,16 +17,16 @@
 package org.apache.openejb.resource.jdbc.router;
 
 import org.apache.openejb.OpenEJB;
+import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
 
 import javax.naming.NamingException;
 import javax.sql.DataSource;
 import javax.sql.XADataSource;
-import javax.transaction.Synchronization;
-import javax.transaction.SystemException;
 import javax.transaction.Transaction;
 import javax.transaction.TransactionManager;
+import javax.transaction.TransactionSynchronizationRegistry;
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
@@ -36,8 +36,6 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Locale;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
@@ -124,7 +122,8 @@ public class FailOverRouter extends Abst
     }
 
     private static class FacadeHandler implements InvocationHandler {
-        private final Map<Transaction, DataSource> txDs = new ConcurrentHashMap<Transaction, DataSource>();
+        private static final TransactionSynchronizationRegistry SYNCHRONIZATION_REGISTRY = SystemInstance.get().getComponent(TransactionSynchronizationRegistry.class);
+        private static final String DATASOURCE_KEY = "router_datasource_in_use";
 
         private final Collection<DataSource> delegates;
         private final String strategy;
@@ -153,8 +152,8 @@ public class FailOverRouter extends Abst
             final Transaction transaction = txMgr.getTransaction();
 
             if (transaction != null) {
-                
-                final DataSource currentDs = txDs.get(transaction);
+
+                final DataSource currentDs = DataSource.class.cast(SYNCHRONIZATION_REGISTRY.getResource(DATASOURCE_KEY));
                 if (currentDs != null) {
                     return method.invoke(currentDs, args);
                 }
@@ -175,8 +174,7 @@ public class FailOverRouter extends Abst
                     }
 
                     if (transaction != null) { // if a tx is in progress save the datasource to use for the tx
-                        transaction.registerSynchronization(new CleanUpSynchronization(txDs));
-                        txDs.put(transaction, ds); // save the ds to use for this transaction
+                        SYNCHRONIZATION_REGISTRY.putResource(DATASOURCE_KEY, ds);
                         break;
                     }
 
@@ -195,29 +193,6 @@ public class FailOverRouter extends Abst
         }
     }
 
-    private static class CleanUpSynchronization implements Synchronization {
-        private final Map<Transaction, DataSource> toClean;
-
-        private CleanUpSynchronization(final Map<Transaction, DataSource> toClean) {
-            this.toClean = toClean;
-        }
-
-        @Override
-        public void beforeCompletion() {
-            // no-op
-        }
-
-        @Override
-        public void afterCompletion(final int status) {
-            try {
-                final Transaction transaction = OpenEJB.getTransactionManager().getTransaction();
-                toClean.remove(transaction);
-            } catch (final SystemException e) {
-                // no-op
-            }
-        }
-    }
-
     private static Collection<DataSource> sortFollowingStrategy(final String strategy, final Collection<DataSource> delegates, final AtomicInteger idx) {
         if (strategy == null) {
             return delegates;