Hello
I'm currently working in a Karaf-based system where TransactionManager and
DataSources are already provided through pax.jdbc.config, geronimo and aries
aries.transaction.blueprint. I would like to introduce TransactionControl as
provided by Aries and I'm trying to configure it with the following approach:
1. // Retrieve existing data source (provided via pax-jdbc):
2. DataSource dataSource = getService(bcontext, DataSource.class,
"(osgi.jndi.service.name=target-persistence-unit)");
3. Map<String, Object> jpaProps = new HashMap<>();
4. jpaProps.put("javax.persistence.dataSource", dataSource);
5. EntityManagerFactoryBuilder emfb = getService(bcontext,
EntityManagerFactoryBuilder.class);
6. JPAEntityManagerProviderFactory resourceProviderFactory =
getService(bcontext, JPAEntityManagerProviderFactory.class);
7. EntityManager em = resourceProviderFactory.getProviderFor(emfb, jpaProps,
jpaProps).getResource(txControl);
Unfortunately line 7 fails with
java.lang.IllegalArgumentException: The datasource supplied to create the
EntityManagerFactory is not an XADataSource and so cannot be enlisted. Please
provide either a javax.persistence.jtaDataSource, a
javax.persistence.nonJtaDataSource, or a javax.persistence.dataSource which
implements XADataSource
at
org.apache.aries.tx.control.jpa.xa.impl.JPAEntityManagerProviderFactoryImpl.handleNormalDataSource(JPAEntityManagerProviderFactoryImpl.java:184)
at
org.apache.aries.tx.control.jpa.xa.impl.JPAEntityManagerProviderFactoryImpl.getProviderFor(JPAEntityManagerProviderFactoryImpl.java:104)
at
org.apache.aries.tx.control.jpa.common.impl.ResourceTrackingJPAEntityManagerProviderFactory.lambda$getProviderFor$0(ResourceTrackingJPAEntityManagerProviderFactory.java:43)
at
org.apache.aries.tx.control.resource.common.impl.TrackingResourceProviderFactory.doGetResult(TrackingResourceProviderFactory.java:47)
at
org.apache.aries.tx.control.jpa.common.impl.ResourceTrackingJPAEntityManagerProviderFactory.getProviderFor(ResourceTrackingJPAEntityManagerProviderFactory.java:43)
...
The Data Source is actually wrapped by DBCP2 and I guess this is why Aries
fails to recognise it as a proper XA data source.
Given that I must use existing TransactionManager (as provided by OSGi JTA
Service spec) and pax.jdbc.config DataSources, my questions are
Is this the right approach to configure the TransactionControl? I have the
feeling that something is missing in Aries to support "external" DataSources
and TransactionManager
Could you please provide guidance on how to achieve this? I think this is
somehow related to this post
<http://karaf.922171.n3.nabble.com/OSGi-Transaction-control-fails-with-hibernate-td4051418.html>:
is the content of that thread still actual?
Many thanks,
Matteo