Tim, many thanks again for your advices.
Definitely it seemed to be a version conflict problem (as almost every problem in OSGi....). Karaf 4.2.0 comes with a not too updated version of Eclipselink and it brings a version 2.6.1 of the Apache Aries JPA Container adapter for EclipseLink. I unistalled it and installed the last version of Aries Tx Ctrl with the JPA Container adapter Ver. 2.7.1-SNAPSHOT, and now it works. I am performing some test for massive data loading, with different granularity of transactions, nested tx, noRollback exceptions etc... and it seems to be a comfortable choice for a big project I'm carry on. Unfortunally I have still some hang session updating the test bundle in Karaf, often with losing of the JPAEntityManagerProvider that appears again only after a lot of attempts, but I will submit the question to Karaf community, as you suggested. So for now, many thanks for your help. This is the list of the bundles I'am working with currently: 19 | Resolved | 80 | 4.2.0.M1 | Apache Karaf :: Diagnostic :: Boot 21 | Active | 80 | 4.2.0.M1 | Apache Karaf :: OSGi Services :: Event 42 | Active | 80 | 1.9.2.1 | Apache ServiceMix :: Bundles :: jasypt 43 | Active | 80 | 1.2.0 | OPS4J Pax JDBC Generic Driver Extender 44 | Active | 80 | 1.2.0 | OPS4J Pax JDBC Config 45 | Active | 80 | 1.2.0 | OPS4J Pax JDBC Pooling Support Base 46 | Active | 80 | 1.0.0.201505202023 | org.osgi:org.osgi.service.jdbc 47 | Active | 80 | 5.1.34 | Oracle Corporation's JDBC Driver for MySQL 48 | Active | 80 | 3.0.0 | Expression Language 3.0 API 49 | Active | 80 | 1.2.0 | CDI APIs 50 | Active | 80 | 1.2 | javax.interceptor API 51 | Active | 80 | 1.2 | javax.transaction API 55 | Active | 80 | 2.7.1.SNAPSHOT | Apache Aries JPA Specification 2.1 API 59 | Active | 80 | 4.2.0.M1 | Apache Karaf :: JDBC :: Core 62 | Active | 80 | 1.0.0.2 | Apache ServiceMix :: Bundles :: javax.inject 63 | Active | 80 | 3.2.0.v201302191141 | EclipseLink ANTLR 64 | Active | 80 | 5.0.1.v201405080102 | EclipseLink ASM 65 | Active | 80 | 2.6.4.v20160829-44060b6 | EclipseLink Core 66 | Active | 80 | 2.6.4.v20160829-44060b6 | EclipseLink JPA 67 | Active | 80 | 2.6.4.v20160829-44060b6 | EclipseLink Hermes Parser 68 | Active | 80 | 1.2.0 | OPS4J Pax JDBC MySQL Driver Adapter 69 | Active | 80 | 0.2.0 | pax-transx-tm-api 70 | Active | 80 | 0.2.0 | pax-transx-tm-geronimo 71 | Active | 80 | 1.0.0 | Apache Aries OSGi Transaction Control Service - XA Transactions 72 | Active | 80 | 1.0.0 | OSGi Transaction Control JPA Resource Provider - XA Transactions 75 | Active | 80 | 2.7.1.SNAPSHOT | Apache Aries JPA Container adapter for EclipseLink 76 | Active | 80 | 0.0.1.SNAPSHOT | fake.test.xa Il giorno gio 23 ago 2018 alle ore 11:07 Timothy Ward < [email protected]> ha scritto: > Hi, > > That is substantial progress - the first error you are seeing is in the > Aries Transaction Control logic for detecting which plugin it should try to > deploy into the JPA provider. This requires version 1.1 of the OSGi JPA > service (which added the getPersistenceProviderName() method to > EntityManagerFactoryBuilder) to work. Now the Transaction Control > implementation correctly imports the JPA spec package at [1.1,2) which > means that the issue is that the JPA service implementation that you’re > using claims to be supporting version 1.1, but actually isn’t. I can’t see > the Aries JPA container (the reference implementation of the v1.1 JPA > Service) deployed in your bundles, which bundle are you using to provide > the JPA service? > > The second error appears to be a bug in Karaf’s processing of > configurations, and probably needs to be reported there. > > > Best Regards, > > Tim > > On 22 Aug 2018, at 22:07, Piero <[email protected]> wrote: > > Hi Timothy, > > Really many thanks for your kind and deep answer. > > I realized now that, trying to solve the original problem (the missing > injection of the JPAEntityManagerProvider) I added a lot of things that > introduced so many other problems and conflicts. > > So I returned to the original code fixing two original errors you showed > to me: now I use an empty persistence unit and I didn't create a karaf > DataSource. > > Now I got the JPAEntityManagerProvider injected but, the execution of the > statement > em = provider.getResource(txControl); > > produces the stack trace: > 23:00:39.896 ERROR [CM Configuration Updater (Update: > pid=org.apache.aries.tx.control.jpa.xa.4f16bf25-b79a-4153-9820-ead68d399c85)] > [fake.test.xa.internal.TaskServiceImpl(2)] The setTxControl method has > thrown an exception > java.lang.NoSuchMethodError: > org.osgi.service.jpa.EntityManagerFactoryBuilder.getPersistenceProviderName()Ljava/lang/String; > at > org.apache.aries.tx.control.jpa.xa.impl.JPAEntityManagerProviderFactoryImpl.setupTransactionManager(JPAEntityManagerProviderFactoryImpl.java:250) > ~[?:?] > at > org.apache.aries.tx.control.jpa.xa.impl.JPAEntityManagerProviderFactoryImpl.getProviderFor(JPAEntityManagerProviderFactoryImpl.java:220) > ~[?:?] > at > org.apache.aries.tx.control.jpa.xa.impl.XAJPAEMFLocator.lambda$getResourceProvider$0(XAJPAEMFLocator.java:51) > ~[?:?] > at > org.apache.aries.tx.control.jpa.common.impl.DelayedJPAEntityManagerProvider.getResource(DelayedJPAEntityManagerProvider.java:56) > ~[?:?] > at > org.apache.aries.tx.control.jpa.common.impl.DelayedJPAEntityManagerProvider.getResource(DelayedJPAEntityManagerProvider.java:28) > ~[?:?] > at > fake.test.xa.internal.TaskServiceImpl.setTxControl(TaskServiceImpl.java:31) > ~[?:?] > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > ~[?:?] > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) > ~[?:?] > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > ~[?:?] > at java.lang.reflect.Method.invoke(Method.java:498) ~[?:?] > at > org.apache.felix.scr.impl.inject.BaseMethod.invokeMethod(BaseMethod.java:229) > ~[61:org.apache.felix.scr:2.0.12] > .... > > So, thanks to your help I made some step forward, but I still am not able > to get en EntityManager by the injected JPAEntityManagerProvider and > TransactionControl. > > The other strange thing is that when I exit and restart Karaf, the > JPAEntityManagerProvider disapears (and so the fake.test.xa bundle remains > in WAITING state): > karaf@test()> diag 76 > fake.test.xa (76) > ----------------- > Status: Waiting > Declarative Services > fake.test.xa.internal.TaskServiceImpl (2) > missing references: Provider > xa.command (3) > missing references: TaskService > > It needs I delete the config file > etc/org.apache.aries.tx.control.jpa.xa-tasklist.cfg. restart the server and > write again the file. Then the provider appears again: > karaf@test()> service:list JPAEntityManagerProvider > [org.osgi.service.transaction.control.jpa.JPAEntityManagerProvider] > ------------------------------------------------------------------- > felix.fileinstall.filename = > file:/C:/KARAF/apache-karaf-4.2.0.M1/instances/test/etc/org.apache.aries.tx.control.jpa.xa-tasklist.cfg > osgi.jdbc.driver.class = com.mysql.jdbc.Driver > osgi.unit.name = tasklist > service.bundleid = 78 > service.factoryPid = org.apache.aries.tx.control.jpa.xa > service.id = 117 > service.pid = > org.apache.aries.tx.control.jpa.xa.4f16bf25-b79a-4153-9820-ead68d399c85 > service.scope = singleton > url = jdbc:mysql://localhost:3306/reactive > user = root > Provided by : > OSGi Transaction Control JPA Resource Provider - XA Transactions (78) > Used by: > fake.test.xa (76) > > Many Thanks again for your help > > > ----- > org.apache.aries.tx.control.jpa.xa-tasklist.cfg: > osgi.unit.name=tasklist > osgi.jdbc.driver.class=com.mysql.jdbc.Driver > user=root > password=root > url=jdbc:mysql://localhost:3306/reactive > > > ----- > TaskServiceImpl (extract): > > @Component(immediate = true) > public class TaskServiceImpl implements TaskService { > > TransactionControl txControl; > JPAEntityManagerProvider provider; > EntityManager em; > > @Reference > void setTxControl(TransactionControl txControl) { > this.txControl = txControl; > if(this.provider!=null) > em = provider.getResource(txControl); > } > > void unsetTxControl(TransactionControl txControl) { > this.txControl = null; > } > > @Reference(target = "(osgi.unit.name=tasklist)") > void setProvider(JPAEntityManagerProvider provider) { > this.provider = provider; > if(this.txControl!=null) > em = provider.getResource(txControl); > } > > void unsetProvider(JPAEntityManagerProvider provider) { > this.provider = null; > } > ... > > ----- > persistence.xml: > > <?xml version="1.0" encoding="UTF-8"?> > <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > xsi:schemaLocation="http://java.sun.com/xml/ns/persistence > http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> > > <persistence-unit name="tasklist" /> > > </persistence> > > > ------ > karaf@test()> list > START LEVEL 100 , List Threshold: 50 > ID | State | Lvl | Version | Name > > ---+----------+-----+---------------------+--------------------------------------------------------------------------------------------------------------------------- > 20 | Resolved | 80 | 4.2.0.M1 | Apache Karaf :: Diagnostic :: > Boot > 22 | Active | 80 | 4.2.0.M1 | Apache Karaf :: OSGi Services > :: Event > 43 | Active | 80 | 1.9.2.1 | Apache ServiceMix :: Bundles > :: jasypt > 44 | Active | 80 | 1.2.0 | OPS4J Pax JDBC Generic Driver > Extender > 45 | Active | 80 | 1.2.0 | OPS4J Pax JDBC Config > 46 | Active | 80 | 1.2.0 | OPS4J Pax JDBC Pooling Support > Base > 47 | Active | 80 | 1.0.0.201505202023 | org.osgi:org.osgi.service.jdbc > 48 | Active | 80 | 1.3.0 | ClassMate > 49 | Active | 80 | 5.1.34 | Oracle Corporation's JDBC > Driver for MySQL > 50 | Active | 80 | 3.20.0.GA <http://3.20.0.ga/> | Javassist > 51 | Active | 80 | 3.0.0 | Expression Language 3.0 API > 52 | Active | 80 | 1.2.0 | CDI APIs > 53 | Active | 80 | 1.2 | javax.interceptor API > 54 | Active | 80 | 2.1.0.v201304241213 | Java Persistence API 2.1 > 55 | Active | 80 | 1.2 | javax.transaction API > 56 | Active | 80 | 1.6.6 | Byte Buddy (without > dependencies) > 62 | Active | 80 | 4.2.0.M1 | Apache Karaf :: JDBC :: Core > 65 | Active | 80 | 2.7.7.5 | Apache ServiceMix :: Bundles > :: antlr > 66 | Active | 80 | 1.6.1.5 | Apache ServiceMix :: Bundles > :: dom4j > 67 | Active | 80 | 1.0.0.2 | Apache ServiceMix :: Bundles > :: javax.inject > 68 | Active | 80 | 5.0.1.Final | hibernate-commons-annotations > 69 | Active | 80 | 5.2.8.Final | hibernate-core > 70 | Active | 80 | 5.2.8.Final | hibernate-osgi > 71 | Active | 80 | 2.0.3.Final | Java Annotation Indexer > 72 | Active | 80 | 3.3.0.Final | JBoss Logging 3 > 73 | Active | 80 | 1.2.0 | OPS4J Pax JDBC MySQL Driver > Adapter > 74 | Active | 80 | 0.2.0 | pax-transx-tm-api > 75 | Active | 80 | 0.2.0 | pax-transx-tm-geronimo > 76 | Waiting | 80 | 0.0.1.SNAPSHOT | fake.test.xa > 78 | Active | 80 | 1.0.0 | OSGi Transaction Control JPA > Resource Provider - XA Transactions > 79 | Active | 80 | 1.0.0 | Apache Aries OSGi Transaction > Control Service - XA Transactions > 81 | Active | 80 | 2.7.1.SNAPSHOT | Apache Aries JPA Specification > 2.1 API > > Il giorno mer 22 ago 2018 alle ore 10:59 Timothy Ward < > [email protected]> ha scritto: > >> Hi Piero, >> >> Sorry to only get to this email chain now. >> >> Firstly, the behaviour that you’re seeing (no JPAEntityManagerProvider >> registered, but a JPAEntityManagerProviderFactory is registered) is >> correct. The Factory service is a generic service that is always registered >> and can be used to programatically create your managed EntityManager >> transactional resource. A JPAEntityManagerProvider service is registered >> only if you set one up as a Configuration Driven Resource. This creates the >> Provider for you based on a configuration in Configuration Admin, and is >> described in the documentation pages >> <http://aries.apache.org/modules/tx-control/xaJPA.html#creating-a-resource-using-a-factory-configuration> >> . >> >> <tldr> >> >> If you want to use Transaction Control then there is a lot of conflicting >> and misconfigured stuff going on in your example. The simplest thing to do >> is to >> >> - Make sure that your persistence unit does not specify any Database >> configuration (this should always come from outside the bundle, whether >> you’re using Transaction Control or not). Specifically delete the >> datasource JNDI name and property configuration entries from the >> persistence.xml. Unless you are using Hibernate Specific annotations you >> should also remove the persistence provider entry (yes, an empty >> persistence unit is a good thing!) >> - Create a Configuration Driven Resource by adding a factory >> configuration for the relevant pid (local transactions look like they >> would >> work fine for you, but stick with XA if you really want). The factory pid >> is *org.apache.aries.tx.control.jpa.local* or >> *org.apache.aries.tx.control.jpa.xa* depending on which >> implementation you choose and you need to specify: >> - *osgi.unit.name <http://osgi.unit.name/>=tasklist* >> - *osgi.jdbc.driver.class=**com.mysql.jdbc.Driver* >> - *user**=root* >> - *password=root* >> - *url=jdbc:mysql://localhost:3306/reactive* >> - Inject the JPAEntityManagerProvider service like you did >> previously. It will be there and you can use it, but make sure your >> transaction control is injected first (the references get sorted into >> alphabetical order by bnd!). >> - >> >> @Reference(name=“alphabeticallyFirst”) >> TransactionControl txControl; >> >> >> @Reference(target = "(osgi.unit.name=tasklist)") >> void setProvider(JPAEntityManagerProvider provider) { >> em = provider.getResource(txControl); >> } >> >> >> >> </tldr> >> >> Now for the complete explanation... >> >> Secondly, I see that you’re having problems with setting up the >> transactionality of your EntityManager, and that you’re using XA >> transactions. This is most likely because the bundles and configurations >> that you have in your runtime are involved in a big fight over who is >> supposed to be controlling what. >> >> You have: >> >> 80 | Active | 80 | 0.2.0 | >>>> mvn:org.ops4j.pax.transx/pax-transx-tm-api/0.2.0 >>>> 81 | Active | 80 | 0.2.0 | >>>> mvn:org.ops4j.pax.transx/pax-transx-tm-geronimo/0.2.0 >>>> >>> >> This is a second transaction management API with a separate transaction >> manager. Transactions that are started/integrated with this will be >> entirely separate from the ones in transaction control, so having these >> bundles present is something of a warning sign that things might not be >> correct. >> >> 94 | Active | 80 | 2.1.1 | >>>> mvn:org.apache.commons/commons-dbcp2/2.1.1 >>>> 95 | Active | 80 | 2.4.2 | >>>> mvn:org.apache.commons/commons-pool2/2.4.2 >>>> 97 | Active | 80 | 1.2.0 | >>>> mvn:org.ops4j.pax.jdbc/pax-jdbc-pool-dbcp2/1.2.0 >>>> >>> >> This is a secondary layer of pooling that is likely to interfere with >> attempts to enlist in transactions. Transaction Control already provides >> pooling so this is at best redundant, and at worst going to break things. >> >> >> jdbc:ds-create -dbName reactive -dn mysql -dc com.mysql.jdbc.Driver -u >>>> root -p root -url "jdbc:mysql://localhost:3306/reactive" reactive >>>> >>> >> >> So what you’re doing here is creating an XA enabled DataSource which >> Karaf is going to enlist with a transaction manager service. This will >> *definitely* fight with the Transaction Control implementation, which does >> not use this mechanism at all. You don’t provide your persistence.xml, but >> at a guess you’re using a JTA Datasource with a JNDI name pointing at the >> DataSource service you’ve just created here. As I’ve mentioned, this will >> mean that the DataSource you’re using is trying to look for completely >> different transactions than are being set up by the Transaction Control >> runtime. >> >> EntityManagerFactory emf = >> Activator.getContext().getService(refemfs.iterator().next()); >> Map<String, Object> pars = new HashMap<>(); >> pars.put("osgi.unit.name", "tasklist"); >> JPAEntityManagerProvider p = pf.getProviderFor(emf, pars); >> >> >> I’m assuming that you didn’t read the JavaDoc for this particular method >> <https://osgi.org/javadoc/osgi.cmpn/7.0.0/org/osgi/service/transaction/control/jpa/JPAEntityManagerProviderFactory.html#getProviderFor-javax.persistence.EntityManagerFactory-java.util.Map->? >> Using an EntityManagerFactory directly with the >> JPAEntityManagerProviderFactory is a very strong statement about how much >> you have set up. You are expected to have registered all of the plugins for >> your provider, and made sure that the correct DataSource transactions are >> set up. It very much looks like you haven’t done this, and this is almost >> certainly the reason that you’re getting the TransactionRequiredException >> out of the EntityManager (specifically because Hibernate is looking for a >> transaction using Java EE and finds nothing. >> >> >> Fixing all this is actually not too hard. The simplest thing to do is to >> use a configuration driven resource (described up top). Persistence units >> should not, in general, define anything about the database connections that >> they want to use, and this should all be driven by configuration admin. >> Failing that, if you want to use the JPAEntityManagerProviderFactory >> service then you should be using the version that takes an >> EntityManagerFactoryBuilder, not an EntityManagerFactory. This will apply >> the necessary plugins to link Hibernate into the Transaction Control >> managed transaction. Transaction Control should be able to unwrap the Karaf >> datasource sufficiently to access the raw XADataSource, but if that isn’t >> possible you will also want to inject the DataSourceFactory and to create >> the XADataSource yourself, passing it in as part of the configuration map. >> >> I would strongly recommend the configuration driven option as the simpler >> way to go. >> >> Best Regards, >> >> Tim >> >> On 20 Aug 2018, at 07:23, Piero <[email protected]> wrote: >> >> Hi, >> >> I'm going more confused..... >> >> I tried to comment the injection: >> // @Reference(target = "(osgi.unit.name=tasklist)") >> // void setProvider(JPAEntityManagerProvider provider) { >> // em = provider.getResource(txControl); >> // } >> >> and to get the provider this way: >> @Reference >> void setTxControl(TransactionControl txControl) { >> this.txControl = txControl; >> try { >> Collection<ServiceReference<JPAEntityManagerProviderFactory>> >> refemfps >> = >> Activator.getContext().getServiceReferences(JPAEntityManagerProviderFactory.class, >> null); >> Collection<ServiceReference<EntityManagerFactory>> refemfs >> = >> Activator.getContext().getServiceReferences(EntityManagerFactory.class, "( >> osgi.unit.name=tasklist)"); >> JPAEntityManagerProviderFactory pf = >> Activator.getContext().getService(refemfps.iterator().next()); >> EntityManagerFactory emf = >> Activator.getContext().getService(refemfs.iterator().next()); >> Map<String, Object> pars = new HashMap<>(); >> pars.put("osgi.unit.name", "tasklist"); >> JPAEntityManagerProvider p = pf.getProviderFor(emf, pars); >> em = p.getResource(txControl); >> } catch (Exception e) { >> // TODO Auto-generated catch block >> e.printStackTrace(); >> } >> } >> >> It worked (!!) and I get working the read methods: >> public Collection<Task> getTasks() { >> return txControl.supports(() -> { >> CriteriaQuery<Task> query = >> em.getCriteriaBuilder().createQuery(Task.class); >> return >> em.createQuery(query.select(query.from(Task.class))).getResultList(); >> }); >> } >> >> But the write methods fails: >> @Override >> public void addTask(Task task) throws Exception { >> if (task.getId() == null) { >> throw new Exception("Id property must be set"); >> } >> System.err.println("Adding task " + task.getId()); >> >> *//Here txControl.activeTransaction()=false* >> txControl.required(()-> { >> *//Here txControl.activeTransaction()=true* >> em.persist(task); * //Here TransactionRequiredException: >> Explicitly joining a JTA transaction requires a JTA transaction be >> currently active* >> em.flush(); >> return null; >> }); >> >> } >> >> >> Now I really can't undertand: >> 1) why the injection of JPAEntityManagerProvider fails while it can be >> got with common BundleContext.getServiceReferences? >> 2) why I obtain a TransactionRequiredException when I checked in >> debugger that txControl.activeTransaction()=true inside the >> txControl.required >> block? >> >> Any help would be very useful. >> >> Tnx >> >> >> >> >> >> 2018-08-19 14:11 GMT+02:00 Piero <[email protected]>: >> >>> Digging some deeper in the environment, I saw that it exists a bundle >>> (ID=84) that should provide the missing service, so I cannot understand why >>> this service does not result suitable for other bundles: >>> >>> karaf@test()> classes 84 | grep -i JPAEntityManagerProvider >>> >>> org/apache/aries/tx/control/jpa/common/impl/AbstractJPAEntityManagerProvider.class >>> >>> org/apache/aries/tx/control/jpa/common/impl/DelayedJPAEntityManagerProvider.class >>> >>> org/apache/aries/tx/control/jpa/common/impl/InternalJPAEntityManagerProviderFactory.class >>> >>> org/apache/aries/tx/control/jpa/common/impl/ResourceTrackingJPAEntityManagerProviderFactory.class >>> >>> org/apache/aries/tx/control/jpa/xa/impl/JPAEntityManagerProviderFactoryImpl$1.class >>> >>> org/apache/aries/tx/control/jpa/xa/impl/JPAEntityManagerProviderFactoryImpl$EnlistingDataSource.class >>> >>> org/apache/aries/tx/control/jpa/xa/impl/JPAEntityManagerProviderFactoryImpl.class >>> >>> org/apache/aries/tx/control/jpa/xa/impl/JPAEntityManagerProviderImpl.class >>> org/osgi/service/transaction/control/jpa/JPAEntityManagerProvider.class >>> >>> org/osgi/service/transaction/control/jpa/JPAEntityManagerProviderFactory.class >>> >>> >>> karaf@test()> headers 84 >>> >>> OSGi Transaction Control JPA Resource Provider - XA Transactions (84) >>> --------------------------------------------------------------------- >>> Archiver-Version = Plexus Archiver >>> Bnd-LastModified = 1525104456341 >>> Build-Jdk = 1.8.0_152 >>> Built-By = timothyjward >>> Created-By = 1.8.0_152 (Oracle Corporation) >>> Implementation-Title = OSGi Transaction Control JPA Resource Provider - >>> XA Transactions >>> Implementation-Vendor = The Apache Software Foundation >>> Implementation-Vendor-Id = org.apache.aries.tx-control >>> Implementation-Version = 1.0.0 >>> Manifest-Version = 1.0 >>> Specification-Title = OSGi Transaction Control JPA Resource Provider - >>> XA Transactions >>> Specification-Vendor = The Apache Software Foundation >>> Specification-Version = 1.0.0 >>> Tool = Bnd-3.3.0.201609221906 >>> >>> Bundle-Activator = org.apache.aries.tx.control.jpa.xa.impl.Activator >>> Bundle-ManifestVersion = 2 >>> Bundle-Name = OSGi Transaction Control JPA Resource Provider - XA >>> Transactions >>> Bundle-SymbolicName = tx-control-provider-jpa-xa >>> Bundle-Version = 1.0.0 >>> >>> Provide-Capability = >>> osgi.service; >>> uses:=org.osgi.service.transaction.control.jpa; >>> >>> objectClass=org.osgi.service.transaction.control.jpa.JPAEntityManagerProvider; >>> osgi.xa.enabled=true, >>> osgi.service; >>> uses:=org.osgi.service.transaction.control.jpa; >>> >>> objectClass=org.osgi.service.transaction.control.jpa.JPAEntityManagerProviderFactory; >>> osgi.xa.enabled=true >>> .... >>> karaf@test()> services 84 >>> >>> OSGi Transaction Control JPA Resource Provider - XA Transactions (84) >>> provides: >>> >>> ------------------------------------------------------------------------------- >>> >>> [org.osgi.service.transaction.control.jpa.JPAEntityManagerProviderFactory] >>> [org.osgi.service.cm.ManagedServiceFactory] >>> >>> >>> >>> >>> 2018-08-19 8:42 GMT+02:00 Piero <[email protected]>: >>> >>>> Hi, >>>> >>>> I would like to receive some help about a non resolving provider >>>> service in a very simple test bundle I wrote to test TransactionControl >>>> with JPAEntityManagerProvider usage with Hibernate on Karaf 4.2. >>>> >>>> The core of the program is a "DAO Service" and both interface and >>>> implementation are reported below. >>>> >>>> It seems the bundle hangs waiting for this missing service provider: >>>> @Reference(target = "(osgi.unit.name=tasklist)") >>>> void setProvider(JPAEntityManagerProvider provider) >>>> >>>> Is anyone so kind to explain me what is missing? >>>> >>>> I included the list of features and bundle installed on karaf as well. >>>> >>>> I created the datasource this way: >>>> jdbc:ds-create -dbName reactive -dn mysql -dc com.mysql.jdbc.Driver >>>> -u root -p root -url "jdbc:mysql://localhost:3306/reactive" reactive >>>> >>>> Thanks in advance >>>> >>>> >>>> API------------------------------------------------------------------- >>>> >>>> package fake.test.xa.api; >>>> >>>> import java.util.Collection; >>>> >>>> import javax.jws.WebService; >>>> >>>> public interface TaskService { >>>> Task getTask(Integer id); >>>> >>>> void addTask(Task task) throws Exception; >>>> >>>> void updateTask(Task task) throws Exception; >>>> >>>> void deleteTask(Integer id) throws Exception; >>>> >>>> Collection<Task> getTasks(); >>>> } >>>> >>>> >>>> IMPL------------------------------------------------------------------------------------- >>>> >>>> package fake.test.xa.internal; >>>> >>>> import java.util.Collection; >>>> import java.util.Date; >>>> >>>> import javax.persistence.EntityManager; >>>> import javax.persistence.criteria.CriteriaQuery; >>>> >>>> import org.osgi.framework.BundleContext; >>>> import org.osgi.service.component.annotations.Activate; >>>> import org.osgi.service.component.annotations.Component; >>>> import org.osgi.service.component.annotations.Deactivate; >>>> import org.osgi.service.component.annotations.Reference; >>>> import org.osgi.service.transaction.control.TransactionControl; >>>> import >>>> org.osgi.service.transaction.control.jpa.JPAEntityManagerProvider; >>>> >>>> import fake.test.xa.api.Task; >>>> import fake.test.xa.api.TaskService; >>>> >>>> @Component(immediate=true) >>>> public class TaskServiceImpl implements TaskService { >>>> >>>> TransactionControl txControl; >>>> >>>> EntityManager em; >>>> @Reference >>>> void setTxControl(TransactionControl txControl) { >>>> this.txControl = txControl; >>>> } >>>> void unsetTxControl(TransactionControl txControl) { >>>> this.txControl = null; >>>> } >>>> >>>> @Reference(target = "(osgi.unit.name=tasklist)") >>>> void setProvider(JPAEntityManagerProvider provider) { >>>> em = provider.getResource(txControl); >>>> } >>>> >>>> @Activate >>>> private void activate(BundleContext ctx) { >>>> System.out.println("Starting the service "+ >>>> getClass().getName() +" at "+new Date()); >>>> } >>>> @Deactivate >>>> private void deactivate(BundleContext ctx) { >>>> System.out.println("Stopping the service"+ getClass().getName() >>>> +" at "+new Date()); >>>> } >>>> >>>> @Override >>>> public Task getTask(Integer id) { >>>> return txControl.supports(() -> em.find(Task.class, id)); >>>> } >>>> >>>> @Override >>>> public void addTask(Task task) throws Exception { >>>> if (task.getId() == null) { >>>> throw new Exception("Id property must be set"); >>>> } >>>> System.err.println("Adding task " + task.getId()); >>>> >>>> txControl.required(()-> { >>>> em.persist(task); >>>> em.flush(); >>>> return null; >>>> }); >>>> >>>> } >>>> >>>> public Collection<Task> getTasks() { >>>> return txControl.supports(() -> { >>>> CriteriaQuery<Task> query = >>>> em.getCriteriaBuilder().createQuery(Task.class); >>>> return >>>> em.createQuery(query.select(query.from(Task.class))).getResultList(); >>>> }); >>>> } >>>> >>>> @Override >>>> public void updateTask(Task task) throws Exception{ >>>> if (task.getId() == null) { >>>> throw new Exception("Id property must be set"); >>>> } >>>> System.err.println("Updating task " + task.getId()); >>>> >>>> if(null==getTask(task.getId())) { >>>> throw new Exception("Task never registered before"); >>>> } >>>> >>>> txControl.required(() -> { >>>> em.merge(task); >>>> em.flush(); >>>> return null; >>>> }); >>>> >>>> } >>>> >>>> @Override >>>> public void deleteTask(Integer id) throws Exception { >>>> System.err.println("Deleting task " + id); >>>> >>>> txControl.required(() -> { >>>> Task task = getTask(id); >>>> if (task == null) { >>>> throw new RuntimeException("Task with id="+id+" not >>>> found"); >>>> } >>>> em.remove(task); >>>> em.flush(); >>>> return null; >>>> }); >>>> >>>> } >>>> >>>> >>>> } >>>> >>>> PERSISTENCE.XML---------------------------------------------------- >>>> <?xml version="1.0" encoding="UTF-8"?> >>>> <persistence version="2.0" xmlns=" >>>> http://java.sun.com/xml/ns/persistence" >>>> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >>>> xsi:schemaLocation="http://java.sun.com/xml/ns/persistence >>>> http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> >>>> >>>> <persistence-unit name="tasklist" transaction-type="JTA"> >>>> >>>> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> >>>> <jta-data-source>osgi:service/javax.sql.DataSource/( >>>> osgi.jndi.service.name=reactive)</jta-data-source> >>>> <properties> >>>> <property name="hibernate.dialect" >>>> value="org.hibernate.dialect.MySQLDialect"/> >>>> <property name="hibernate.hbm2ddl.auto" >>>> value="create-drop"/> >>>> </properties> >>>> </persistence-unit> >>>> >>>> </persistence> >>>> >>>> >>>> POM.XML---------------------------------------------------- >>>> >>>> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=" >>>> http://www.w3.org/2001/XMLSchema-instance" >>>> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 >>>> http://maven.apache.org/xsd/maven-4.0.0.xsd"> >>>> <modelVersion>4.0.0</modelVersion> >>>> >>>> <groupId>fake</groupId> >>>> <artifactId>test.xa</artifactId> >>>> <version>0.0.1-SNAPSHOT</version> >>>> <name>fake.test.xa</name> >>>> <packaging>bundle</packaging> >>>> >>>> <properties> >>>> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> >>>> >>>> <java.version>1.8</java.version> >>>> <osgi.version>6.0.0</osgi.version> >>>> <osgi.compendium.version>5.0.0</osgi.compendium.version> >>>> >>>> <aries.jpa.version>2.2.0</aries.jpa.version> >>>> >>>> <dosgi.version>2.3.0</dosgi.version> >>>> <aQute.version>1.50.0</aQute.version> >>>> <enroute.version>2.0.0</enroute.version> >>>> >>>> <karaf.shell.console.version>4.0.3</karaf.shell.console.version> >>>> >>>> <maven.bundle.plugin.version>3.3.0</maven.bundle.plugin.version> >>>> <maven-resources-plugin.version>3.0.2</maven-resources-plugin.version> >>>> >>>> <transaction.version>2.0.0</transaction.version> >>>> <transaction-api.version>1.2</transaction-api.version> >>>> <jdbc.version>1.2.1</jdbc.version> >>>> <aries.tx.control.version>1.0.0</aries.tx.control.version> >>>> >>>> <baseline.skip>true</baseline.skip> >>>> >>>> <topDirectoryLocation>..</topDirectoryLocation> >>>> </properties> >>>> >>>> <dependencies> >>>> <dependency> >>>> <groupId>org.osgi</groupId> >>>> <artifactId>osgi.core</artifactId> >>>> <version>${osgi.version}</version> >>>> </dependency> >>>> >>>> <dependency> >>>> <groupId>org.osgi</groupId> >>>> <artifactId>osgi.cmpn</artifactId> >>>> <version>${osgi.compendium.version}</version> >>>> </dependency> >>>> >>>> <dependency> >>>> <groupId>biz.aQute</groupId> >>>> <artifactId>bndlib</artifactId> >>>> <version>${aQute.version}</version> >>>> </dependency> >>>> >>>> <dependency> >>>> <groupId>org.osgi</groupId> >>>> <artifactId>osgi.enroute.base.api</artifactId> >>>> <version>${enroute.version}</version> >>>> </dependency> >>>> >>>> <dependency> >>>> <groupId>org.apache.karaf.shell</groupId> >>>> <artifactId>org.apache.karaf.shell.console</artifactId> >>>> <version>${karaf.shell.console.version}</version> >>>> </dependency> >>>> >>>> <dependency> >>>> <groupId>javax.transaction</groupId> >>>> <artifactId>javax.transaction-api</artifactId> >>>> <version>${transaction-api.version}</version> >>>> </dependency> >>>> >>>> <dependency> >>>> <groupId>org.apache.aries.jpa</groupId> >>>> <artifactId>org.apache.aries.jpa.api</artifactId> >>>> <version>${aries.jpa.version}</version> >>>> </dependency> >>>> <dependency> >>>> <groupId>org.apache.aries.jpa</groupId> >>>> <artifactId>org.apache.aries.jpa.support</artifactId> >>>> <version>${aries.jpa.version}</version> >>>> </dependency> >>>> >>>> >>>> <dependency> >>>> <groupId>org.hibernate.javax.persistence</groupId> >>>> <artifactId>hibernate-jpa-2.1-api</artifactId> >>>> <version>1.0.0.Final</version> >>>> </dependency> >>>> >>>> <dependency> >>>> <groupId>org.apache.aries.tx-control</groupId> >>>> <artifactId>tx-control-service-xa</artifactId> >>>> <version>${aries.tx.control.version}</version> >>>> </dependency> >>>> <dependency> >>>> <groupId>org.apache.aries.tx-control</groupId> >>>> <artifactId>tx-control-provider-jpa-xa</artifactId> >>>> <version>${aries.tx.control.version}</version> >>>> </dependency> >>>> </dependencies> >>>> >>>> >>>> >>>> >>>> <build> >>>> <resources> >>>> <resource> >>>> <directory>src/main/resources</directory> >>>> <filtering>true</filtering> >>>> </resource> >>>> </resources> >>>> >>>> <pluginManagement> >>>> <plugins> >>>> >>>> <plugin> >>>> <groupId>org.apache.felix</groupId> >>>> <artifactId>maven-bundle-plugin</artifactId> >>>> <version>${maven.bundle.plugin.version}</version> >>>> </plugin> >>>> >>>> <plugin> >>>> <groupId>org.apache.maven.plugins</groupId> >>>> <artifactId>maven-resources-plugin</artifactId> >>>> <version>${maven-resources-plugin.version}</version> >>>> </plugin> >>>> </plugins> >>>> </pluginManagement> >>>> >>>> <plugins> >>>> <plugin> >>>> <groupId>org.apache.maven.plugins</groupId> >>>> <artifactId>maven-compiler-plugin</artifactId> >>>> <configuration> >>>> <source>${java.version}</source> >>>> <target>${java.version}</target> >>>> </configuration> >>>> </plugin> >>>> >>>> <plugin> >>>> <groupId>org.apache.felix</groupId> >>>> <artifactId>maven-bundle-plugin</artifactId> >>>> <extensions>true</extensions> >>>> <configuration> >>>> <instructions> >>>> <_include>-bnd.bnd</_include> >>>> <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName> >>>> <Bundle-Version>${project.version}</Bundle-Version> >>>> <Service-Component>*</Service-Component> >>>> <Bundle-Activator>fake.test.xa.internal.Activator</Bundle-Activator> >>>> <!-- <Export-Package>fake.test.xa.*;version=${project.version} >>>> </Export-Package> --> >>>> <Import-Package>*</Import-Package> >>>> <Meta-Persistence>META-INF/persistence.xml</Meta-Persistence> >>>> </instructions> >>>> </configuration> >>>> </plugin> >>>> >>>> </plugins> >>>> </build> >>>> </project> >>>> >>>> ----------------------------------------------------------------- >>>> >>>> >>>> karaf@test()> diag 98 >>>> fake.test.xa (98) >>>> ----------------- >>>> Status: Waiting >>>> Declarative Services >>>> xa.command (9) >>>> missing references: TaskService >>>> fake.test.xa.internal.TaskServiceImpl (8) >>>> missing references: Provider >>>> >>>> >>>> >>>> karaf@test()> feature:list -i >>>> Name | Version | Required | State | >>>> Repository | Description >>>> >>>> -----------------------------+-------------+----------+---------+--------------------------+-------------------------------------------------- >>>> aries-proxy | 4.2.0.M1 | | Started | >>>> standard-4.2.0.M1 | Aries Proxy >>>> feature | 4.2.0.M1 | x | Started | >>>> standard-4.2.0.M1 | Features Support >>>> shell | 4.2.0.M1 | x | Started | >>>> standard-4.2.0.M1 | Karaf Shell >>>> deployer | 4.2.0.M1 | x | Started | >>>> standard-4.2.0.M1 | Karaf Deployer >>>> bundle | 4.2.0.M1 | x | Started | >>>> standard-4.2.0.M1 | Provide Bundle support >>>> config | 4.2.0.M1 | x | Started | >>>> standard-4.2.0.M1 | Provide OSGi ConfigAdmin support >>>> diagnostic | 4.2.0.M1 | x | Started | >>>> standard-4.2.0.M1 | Provide Diagnostic support >>>> instance | 4.2.0.M1 | x | Started | >>>> standard-4.2.0.M1 | Provide Instance support >>>> jaas | 4.2.0.M1 | x | Started | >>>> standard-4.2.0.M1 | Provide JAAS support >>>> log | 4.2.0.M1 | x | Started | >>>> standard-4.2.0.M1 | Provide Log support >>>> package | 4.2.0.M1 | x | Started | >>>> standard-4.2.0.M1 | Package commands and mbeans >>>> service | 4.2.0.M1 | x | Started | >>>> standard-4.2.0.M1 | Provide Service support >>>> system | 4.2.0.M1 | x | Started | >>>> standard-4.2.0.M1 | Provide System support >>>> kar | 4.2.0.M1 | x | Started | >>>> standard-4.2.0.M1 | Provide KAR (KARaf archive) support >>>> ssh | 4.2.0.M1 | x | Started | >>>> standard-4.2.0.M1 | Provide a SSHd server on Karaf >>>> management | 4.2.0.M1 | x | Started | >>>> standard-4.2.0.M1 | Provide a JMX MBeanServer and a set of MBeans in >>>> eventadmin | 4.2.0.M1 | x | Started | >>>> standard-4.2.0.M1 | OSGi Event Admin service specification for >>>> event- >>>> scr | 4.2.0.M1 | x | Started | >>>> standard-4.2.0.M1 | Declarative Service support >>>> wrap | 2.5.3 | x | Started | >>>> standard-4.2.0.M1 | Wrap URL handler >>>> pax-transx-tm-api | 0.2.0 | | Started | >>>> pax-transx-0.2.0 | >>>> pax-transx-tm-geronimo | 0.2.0 | | Started | >>>> pax-transx-0.2.0 | >>>> hibernate-orm | 5.2.8.Final | | Started | >>>> hibernate-osgi | Combines all Hibernate core dependencies and >>>> requ >>>> transaction-api | 1.2.0 | | Started | >>>> enterprise-4.2.0.M1 | >>>> transaction-manager-geronimo | 3.1.3 | | Started | >>>> enterprise-4.2.0.M1 | Geronimo Transaction Manager >>>> transaction | 2.0.0 | x | Started | >>>> enterprise-4.2.0.M1 | OSGi Transaction Manager >>>> hibernate | 5.2.8.Final | x | Started | >>>> enterprise-4.2.0.M1 | Hibernate JPA engine support >>>> jndi | 4.2.0.M1 | x | Started | >>>> enterprise-4.2.0.M1 | OSGi Service Registry JNDI access >>>> jdbc | 4.2.0.M1 | x | Started | >>>> enterprise-4.2.0.M1 | JDBC service and commands >>>> pax-jdbc-spec | 1.2.0 | | Started | >>>> org.ops4j.pax.jdbc-1.2.0 | Provides OSGi JDBC Service spec >>>> pax-jdbc | 1.2.0 | | Started | >>>> org.ops4j.pax.jdbc-1.2.0 | Provides JDBC Service support >>>> pax-jdbc-config | 1.2.0 | | Started | >>>> org.ops4j.pax.jdbc-1.2.0 | Provides JDBC Config support >>>> pax-jdbc-mysql | 1.2.0 | x | Started | >>>> org.ops4j.pax.jdbc-1.2.0 | Provides JDBC MySQL DataSourceFactory >>>> pax-jdbc-pool-dbcp2 | 1.2.0 | x | Started | >>>> org.ops4j.pax.jdbc-1.2.0 | Provides JDBC Pooling DataSourceFactory >>>> jpa | 2.6.1 | x | Started | >>>> aries-jpa-2.6.1 | OSGi Persistence Container >>>> >>>> >>>> karaf@test()> list -u >>>> START LEVEL 100 , List Threshold: 50 >>>> ID | State | Lvl | Version | Update location >>>> >>>> ---+----------+-----+--------------------+---------------------------------------------------------------------------------------------------------------------------- >>>> 20 | Resolved | 80 | 4.2.0.M1 | >>>> mvn:org.apache.karaf.diagnostic/org.apache.karaf.diagnostic.boot/4.2.0.M1 >>>> 22 | Active | 80 | 4.2.0.M1 | >>>> mvn:org.apache.karaf/org.apache.karaf.event/4.2.0.M1 >>>> 43 | Active | 80 | 1.9.2.1 | >>>> mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.jasypt/1.9.2_1 >>>> 44 | Active | 80 | 1.2.0 | >>>> mvn:org.ops4j.pax.jdbc/pax-jdbc/1.2.0 >>>> 45 | Active | 80 | 1.2.0 | >>>> mvn:org.ops4j.pax.jdbc/pax-jdbc-config/1.2.0 >>>> 46 | Active | 80 | 1.2.0 | >>>> mvn:org.ops4j.pax.jdbc/pax-jdbc-pool-common/1.2.0 >>>> 47 | Active | 80 | 1.0.0.201505202023 | >>>> mvn:org.osgi/org.osgi.service.jdbc/1.0.0 >>>> 48 | Active | 80 | 1.3.0 | >>>> mvn:com.fasterxml/classmate/1.3.0 >>>> 49 | Active | 80 | 5.1.34 | >>>> mvn:mysql/mysql-connector-java/5.1.34 >>>> 50 | Active | 80 | 3.20.0.GA <http://3.20.0.ga/> | >>>> mvn:org.javassist/javassist/3.20.0-GA >>>> 51 | Active | 80 | 3.0.0 | >>>> mvn:javax.el/javax.el-api/3.0.0 >>>> 52 | Active | 80 | 1.2.0 | >>>> mvn:javax.enterprise/cdi-api/1.2 >>>> 53 | Active | 80 | 1.2 | mvn:javax.interceptor/ >>>> javax.interceptor-api/1.2 >>>> 55 | Active | 80 | 1.2 | mvn:javax.transaction/ >>>> javax.transaction-api/1.2 >>>> 56 | Active | 80 | 1.6.6 | >>>> mvn:net.bytebuddy/byte-buddy/1.6.6 >>>> 67 | Active | 80 | 4.2.0.M1 | >>>> mvn:org.apache.karaf.jdbc/org.apache.karaf.jdbc.core/4.2.0. >>>> <http://4.2.0.0/>M1 >>>> 69 | Active | 80 | 2.7.7.5 | >>>> mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.antlr/2.7.7_5 >>>> 70 | Active | 80 | 1.6.1.5 | >>>> mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.dom4j/1.6.1_5 >>>> 71 | Active | 80 | 1.0.0.2 | >>>> mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.javax-inject/1_2 >>>> 73 | Active | 80 | 5.0.1.Final | >>>> mvn:org.hibernate.common/hibernate-commons-annotations/5.0.1.Final >>>> 74 | Active | 80 | 5.2.8.Final | >>>> mvn:org.hibernate/hibernate-core/5.2.8.Final >>>> 75 | Active | 80 | 5.2.8.Final | >>>> mvn:org.hibernate/hibernate-osgi/5.2.8.Final >>>> 76 | Active | 80 | 2.0.3.Final | mvn:org.jboss/jandex/2.0.3. >>>> <http://2.0.0.3/>Final >>>> 77 | Active | 80 | 3.3.0.Final | >>>> mvn:org.jboss.logging/jboss-logging/3.3.0.Final >>>> 79 | Active | 80 | 1.2.0 | >>>> mvn:org.ops4j.pax.jdbc/pax-jdbc-mysql/1.2.0 >>>> 80 | Active | 80 | 0.2.0 | >>>> mvn:org.ops4j.pax.transx/pax-transx-tm-api/0.2.0 >>>> 81 | Active | 80 | 0.2.0 | >>>> mvn:org.ops4j.pax.transx/pax-transx-tm-geronimo/0.2.0 >>>> 82 | Active | 80 | 1.0.0 | >>>> mvn:org.apache.aries.tx-control/tx-control-service-xa/1.0.0 >>>> 83 | Active | 80 | 1.0.0 | >>>> mvn:org.apache.aries.tx-control/tx-control-provider-jdbc-xa/1.0.0 >>>> 84 | Active | 80 | 1.0.0 | >>>> mvn:org.apache.aries.tx-control/tx-control-provider-jpa-xa/1.0.0 >>>> 92 | Active | 80 | 2.7.1.SNAPSHOT | >>>> mvn:org.apache.aries.jpa.javax.persistence/javax.persistence_2.1/2.7.1-SNAPSHOT >>>> 94 | Active | 80 | 2.1.1 | >>>> mvn:org.apache.commons/commons-dbcp2/2.1.1 >>>> 95 | Active | 80 | 2.4.2 | >>>> mvn:org.apache.commons/commons-pool2/2.4.2 >>>> 96 | Active | 80 | 3.2.4.1 | >>>> mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.cglib/3.2.4_1 >>>> 97 | Active | 80 | 1.2.0 | >>>> mvn:org.ops4j.pax.jdbc/pax-jdbc-pool-dbcp2/1.2.0 >>>> 98 | Waiting | 80 | 0.0.1.SNAPSHOT | >>>> file:/C:/KARAF/apache-karaf-4.2.0.M1/instances/test/deploy/test.xa-0.0.1-SNAPSHOT.jar >>>> >>> >>> >> >> >
