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());