You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by ti...@apache.org on 2016/08/17 11:09:05 UTC

svn commit: r1756612 - in /aries/trunk/tx-control: tx-control-jpa-itests/ tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/ tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/

Author: timothyjward
Date: Wed Aug 17 11:09:04 2016
New Revision: 1756612

URL: http://svn.apache.org/viewvc?rev=1756612&view=rev
Log:
[tx-control] Ensure that the same ThreadLocal is used for all resources created by an XA JPAEntityManagerProvider

Modified:
    aries/trunk/tx-control/tx-control-jpa-itests/pom.xml
    aries/trunk/tx-control/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/XAJPATransactionTest.java
    aries/trunk/tx-control/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/JPAEntityManagerProviderFactoryImpl.java
    aries/trunk/tx-control/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/ManagedJPAEMFLocator.java

Modified: aries/trunk/tx-control/tx-control-jpa-itests/pom.xml
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-jpa-itests/pom.xml?rev=1756612&r1=1756611&r2=1756612&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-jpa-itests/pom.xml (original)
+++ aries/trunk/tx-control/tx-control-jpa-itests/pom.xml Wed Aug 17 11:09:04 2016
@@ -106,6 +106,18 @@
             <version>1.0.0</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.util.function</artifactId>
+            <version>1.0.0</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.util.promise</artifactId>
+            <version>1.0.0</version>
+            <scope>test</scope>
+        </dependency>
 		<dependency>
 			<groupId>com.h2database</groupId>
 			<artifactId>h2</artifactId>

Modified: aries/trunk/tx-control/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/XAJPATransactionTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/XAJPATransactionTest.java?rev=1756612&r1=1756611&r2=1756612&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/XAJPATransactionTest.java (original)
+++ aries/trunk/tx-control/tx-control-jpa-itests/src/test/java/org/apache/aries/tx/control/itests/XAJPATransactionTest.java Wed Aug 17 11:09:04 2016
@@ -71,6 +71,7 @@ import org.osgi.service.jpa.EntityManage
 import org.osgi.service.transaction.control.TransactionControl;
 import org.osgi.service.transaction.control.TransactionRolledBackException;
 import org.osgi.service.transaction.control.jpa.JPAEntityManagerProvider;
+import org.osgi.util.promise.Deferred;
 import org.osgi.util.tracker.ServiceTracker;
 
 @RunWith(PaxExam.class)
@@ -243,6 +244,8 @@ public abstract class XAJPATransactionTe
 				.useOptions(CoreOptions.vmOption("-Dorg.ops4j.pax.url.mvn.localRepository=" + localRepo)),
 				mavenBundle("org.apache.aries.tx-control", "tx-control-service-xa").versionAsInProject(),
 				mavenBundle("com.h2database", "h2").versionAsInProject(),
+				mavenBundle("org.osgi", "org.osgi.util.function").versionAsInProject(),
+				mavenBundle("org.osgi", "org.osgi.util.promise").versionAsInProject(),
 				mavenBundle("org.apache.aries.tx-control", "tx-control-provider-jpa-xa").versionAsInProject(),
 				jpaProvider(),
 				ariesJPAVersion(),
@@ -351,6 +354,50 @@ public abstract class XAJPATransactionTe
 		}));
 	}
 	
+	@Test
+	public void testSeparateThreadActivation() throws Exception {
+		Object m1 = getMessageEntityFrom(XA_TEST_UNIT_1);
+		Object m2 = getMessageEntityFrom(XA_TEST_UNIT_2);
+
+		txControl.required(() -> {
+			setMessage(m1, "Hello World!");
+			
+			em1.persist(m1);
+
+			setMessage(m2, "Hello 1!");
+			
+			em2.persist(m2);
+			
+			return null;
+		});
+		
+		Deferred<String> d = new Deferred<>();
+		
+		new Thread(() -> {
+				try {
+					d.resolve(txControl.notSupported(() -> 
+						getMessage(em1.find(m1.getClass(), getId(m1)))));
+				} catch (Exception e) {
+					d.fail(e);
+				}
+			}).start();
+		
+		assertEquals("Hello World!", d.getPromise().getValue());
+
+		Deferred<String> d2 = new Deferred<>();
+		
+		new Thread(() -> {
+				try {
+					d2.resolve(txControl.notSupported(() -> 
+						getMessage(em2.find(m2.getClass(), getId(m2)))));
+				} catch (Exception e) {
+					d2.fail(e);
+				}
+			}).start();
+		
+		assertEquals("Hello 1!", d2.getPromise().getValue());
+	}
+	
 	Object getMessageEntityFrom(String unit) throws Exception {
 		Class<?> clz = Arrays.stream(context.getBundles())
 					.filter(b -> unit.equals(b.getSymbolicName()))

Modified: aries/trunk/tx-control/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/JPAEntityManagerProviderFactoryImpl.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/JPAEntityManagerProviderFactoryImpl.java?rev=1756612&r1=1756611&r2=1756612&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/JPAEntityManagerProviderFactoryImpl.java (original)
+++ aries/trunk/tx-control/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/JPAEntityManagerProviderFactoryImpl.java Wed Aug 17 11:09:04 2016
@@ -52,15 +52,18 @@ public class JPAEntityManagerProviderFac
 	@Override
 	public JPAEntityManagerProvider getProviderFor(EntityManagerFactoryBuilder emfb, Map<String, Object> jpaProperties,
 			Map<String, Object> resourceProviderProperties) {
-		return new DelayedJPAEntityManagerProvider(tx -> {
-				Map<String, Object> toUse;
-				if(checkEnlistment(resourceProviderProperties)) {
-					toUse = enlistDataSource(tx, jpaProperties);
-				} else {
-					toUse = jpaProperties;
-				}
-				return tx.get().notSupported(() -> internalBuilderCreate(emfb, toUse, tx));
-			});
+		return new DelayedJPAEntityManagerProvider(tx -> getProviderFor(emfb, jpaProperties, resourceProviderProperties, tx));
+	}
+
+	public JPAEntityManagerProvider getProviderFor(EntityManagerFactoryBuilder emfb, Map<String, Object> jpaProperties,
+		Map<String, Object> resourceProviderProperties, ThreadLocal<TransactionControl> localStore) {
+		Map<String, Object> toUse;
+		if(checkEnlistment(resourceProviderProperties)) {
+			toUse = enlistDataSource(localStore, jpaProperties);
+		} else {
+			toUse = jpaProperties;
+		}
+		return localStore.get().notSupported(() -> internalBuilderCreate(emfb, toUse, localStore));
 	}
 
 	private Map<String, Object> enlistDataSource(ThreadLocal<TransactionControl> tx, Map<String, Object> jpaProperties) {

Modified: aries/trunk/tx-control/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/ManagedJPAEMFLocator.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/ManagedJPAEMFLocator.java?rev=1756612&r1=1756611&r2=1756612&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/ManagedJPAEMFLocator.java (original)
+++ aries/trunk/tx-control/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/ManagedJPAEMFLocator.java Wed Aug 17 11:09:04 2016
@@ -119,7 +119,7 @@ public class ManagedJPAEMFLocator implem
 					setupTransactionManager(jpaProps, providerProps, t, reference);
 					
 					return new JPAEntityManagerProviderFactoryImpl().getProviderFor(service,
-							jpaProps, providerProps);
+							jpaProps, providerProps, t);
 				});
 				ServiceRegistration<JPAEntityManagerProvider> reg = context
 						.registerService(JPAEntityManagerProvider.class, jpaEM, getServiceProperties());