You can have two DataSources in the persistence.xml but only one will be used. If you set /transaction-type="JTA" /
then only the jta DataSource will be used. So this is not the problem.

The problem is that you set an XADataSource
/<jta-data-source>osgi:service/javax.sql.XADataSource/(osgi.jndi.service.name <http://osgi.jndi.service.name>=jdbc/filetransferhistoryjta)</jta-data-source>/

What you need is an OSGi service of type DataSource that internally wraps an XADataSource. This is a common pattern that also JEE servers use. The easiest way to achieve this is to use the config, pooling and XA support of pax-jdbc. See
https://ops4j1.jira.com/wiki/display/PAXJDBC/Pooling+and+XA+support+for+DataSourceFactory

Apart from that I think your setup looks good now.

Could you open an issue in the karaf jira about the problems with the openjpa feature? I will fix it then for the next karaf version.

Christian

On 07.07.2016 16:18, Bengt Rodehav wrote:
I assume that I cannot reference two datasources from my persistence.xml. I therefore removed the <non-jta-data-source>.

This makes the JNDI problem go away.

I now have a EntityManagerFactoryBuilder published as a service:

/karaf@root()> service:list EntityManagerFactoryBuilder/
/[org.osgi.service.jpa.EntityManagerFactoryBuilder]/
/--------------------------------------------------/
/osgi.unit.name <http://osgi.unit.name> = filetransferhistoryPU/
/ osgi.unit.provider = org.apache.openjpa.persistence.PersistenceProviderImpl/
/ osgi.unit.version = 2.8.0.SNAPSHOT/
/ service.bundleid = 38/
/service.id <http://service.id> = 346/
/ service.scope = singleton/
/Provided by :/
/ Apache Aries JPA container (38)/

But no EntityManager or EntityManagerFactory:

/karaf@root()> service:list EntityManagerFactory
/
/karaf@root()> service:list EntityManager
/
/karaf@root()>
/
/
/
Which (after a while of "grace period") causes this:

/2016-07-07 16:10:07,546 | ERROR | rint Extender: 1 | BlueprintContainerImpl | ntainer.BlueprintContainerImpl$1 374 | Unable to start blueprint container for bundle se.digia.connect.services.filetransfer.history-db/2.8.0.SNAPSHOT due to unresolved dependencies [(&(osgi.unit.name <http://osgi.unit.name>=filetransferhistoryPU)(objectClass=javax.persistence.EntityManager))]/
/java.util.concurrent.TimeoutException/
/at org.apache.aries.blueprint.container.BlueprintContainerImpl$1.run(BlueprintContainerImpl.java:371)[24:org.apache.aries.blueprint.core:1.6.1]/ /at org.apache.aries.blueprint.utils.threading.impl.DiscardableRunnable.run(DiscardableRunnable.java:48)[24:org.apache.aries.blueprint.core:1.6.1]/ /at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)[:1.8.0_74]/
/at java.util.concurrent.FutureTask.run(FutureTask.java:266)[:1.8.0_74]/
/at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)[:1.8.0_74]/ /at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)[:1.8.0_74]/ /at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)[:1.8.0_74]/ /at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)[:1.8.0_74]/
/at java.lang.Thread.run(Thread.java:745)[:1.8.0_74]/


I feel like I'm getting closer but there is still something missing to get all the way to an EntityManager...

/Bengt











2016-07-07 15:56 GMT+02:00 Bengt Rodehav <[email protected] <mailto:[email protected]>>:

    Both data sources are published:

    /karaf@root()> service:list DataSource/
    /[javax.sql.DataSource]/
    /----------------------/
    /osgi.jndi.service.name <http://osgi.jndi.service.name> =
    jdbc/filetransferhistorynojta/
    / osgi.service.blueprint.compname = derbyDataSource/
    / service.bundleid = 178/
    /service.id <http://service.id> = 323/
    / service.scope = bundle/
    /Provided by :/
    / Connect :: filetransfer-history-datasource (178)/
    /
    /
    /karaf@root()> service:list XADataSource/
    /[javax.sql.XADataSource]/
    /------------------------/
    /osgi.jndi.service.name <http://osgi.jndi.service.name> =
    jdbc/filetransferhistoryjta/
    / osgi.service.blueprint.compname = derbyXADataSource/
    / service.bundleid = 178/
    /service.id <http://service.id> = 324/
    / service.scope = bundle/
    /Provided by :/
    / Connect :: filetransfer-history-datasource (178)/

    The problem seems to be that I cannot refer to both of them in
    persistence.xml...

    /Bengt


    2016-07-07 15:48 GMT+02:00 Bengt Rodehav <[email protected]
    <mailto:[email protected]>>:

        Interesting...

        I now changed the jpa feature to the following:

        /  <feature name="jpa" description="OSGi Persistence
        Container" version="2.3.0">/
        /      <details>JPA implementation provided by Apache Aries
        JPA 2.x. NB: this feature doesn't provide the JPA engine, you
        have to install one by yourself (OpenJPA for instance)</details>/
        /      <feature version="[1.1,2)" prerequisite="false"
        dependency="false">transaction-api</feature>/
        /*<bundle
        dependency="true">mvn:org.osgi/org.osgi.service.jpa/1.0.0</bundle>*/
        /      <feature version="[2.0.0,*2.1.0*)" prerequisite="false"
        dependency="false">persistence-api</feature>
        /

        Which removed the previous error I had. But I now get JNDI
        problems:

        2016-07-07 15:32:37,240 | ERROR | pool-7-thread-1  |
        BootFeaturesInstaller        |
        al.service.BootFeaturesInstaller  128 | Error installing boot
        features
        org.apache.karaf.features.internal.util.MultiException: Error
        restarting bundles
        at
        
org.apache.karaf.features.internal.service.Deployer.deploy(Deployer.java:848)[9:org.apache.karaf.features.core:4.0.5]
        at
        
org.apache.karaf.features.internal.service.FeaturesServiceImpl.doProvision(FeaturesServiceImpl.java:1152)[9:org.apache.karaf.features.core:4.0.5]
        at
        
org.apache.karaf.features.internal.service.FeaturesServiceImpl$1.call(FeaturesServiceImpl.java:1048)[9:org.apache.karaf.features.core:4.0.5]
        at
        java.util.concurrent.FutureTask.run(FutureTask.java:266)[:1.8.0_74]
        at
        
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)[:1.8.0_74]
        at
        
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)[:1.8.0_74]
        at java.lang.Thread.run(Thread.java:745)[:1.8.0_74]
        Caused by: org.osgi.framework.BundleException: Activator start
        error in bundle org.apache.aries.jpa.container [38].
        at
        
org.apache.felix.framework.Felix.activateBundle(Felix.java:2276)[org.apache.felix.framework-5.4.0.jar:]
        at
        
org.apache.felix.framework.Felix.startBundle(Felix.java:2144)[org.apache.felix.framework-5.4.0.jar:]
        at
        
org.apache.felix.framework.BundleImpl.start(BundleImpl.java:998)[org.apache.felix.framework-5.4.0.jar:]
        at
        
org.apache.felix.framework.BundleImpl.start(BundleImpl.java:984)[org.apache.felix.framework-5.4.0.jar:]
        at
        
org.apache.karaf.features.internal.service.FeaturesServiceImpl.startBundle(FeaturesServiceImpl.java:1262)[9:org.apache.karaf.features.core:4.0.5]
        at
        
org.apache.karaf.features.internal.service.Deployer.deploy(Deployer.java:840)[9:org.apache.karaf.features.core:4.0.5]
        ... 6 more
        Caused by: java.lang.IllegalArgumentException:
        org.osgi.framework.InvalidSyntaxException: Only one top-level
        operation allowed:
        (&(objectClass=javax.sql.DataSource)(osgi.jndi.service.name
        
<http://osgi.jndi.service.name>=osgi:service/javax.sql.XADataSource/(osgi.jndi.service.name
        <http://osgi.jndi.service.name>=jdbc/filetransferhistoryjta)))
        at
        
org.apache.aries.jpa.container.impl.DataSourceTracker.createFilter(DataSourceTracker.java:64)[38:org.apache.aries.jpa.container:2.3.0]
        at
        
org.apache.aries.jpa.container.impl.DataSourceTracker.<init>(DataSourceTracker.java:46)[38:org.apache.aries.jpa.container:2.3.0]
        at
        
org.apache.aries.jpa.container.impl.PersistenceProviderTracker.createDataSourceTracker(PersistenceProviderTracker.java:120)[38:org.apache.aries.jpa.container:2.3.0]
        at
        
org.apache.aries.jpa.container.impl.PersistenceProviderTracker.addingService(PersistenceProviderTracker.java:87)[38:org.apache.aries.jpa.container:2.3.0]
        at
        
org.apache.aries.jpa.container.impl.PersistenceProviderTracker.addingService(PersistenceProviderTracker.java:44)[38:org.apache.aries.jpa.container:2.3.0]
        at
        
org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:941)[org.osgi.core-6.0.0.jar:]
        at
        
org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:870)[org.osgi.core-6.0.0.jar:]
        at
        
org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:256)[org.osgi.core-6.0.0.jar:]
        at
        
org.osgi.util.tracker.AbstractTracked.trackInitial(AbstractTracked.java:183)[org.osgi.core-6.0.0.jar:]
        at
        
org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:318)[org.osgi.core-6.0.0.jar:]
        at
        
org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:261)[org.osgi.core-6.0.0.jar:]
        at
        
org.apache.aries.jpa.container.impl.PersistenceBundleTracker.trackProvider(PersistenceBundleTracker.java:106)[38:org.apache.aries.jpa.container:2.3.0]
        at
        
org.apache.aries.jpa.container.impl.PersistenceBundleTracker.findPersistenceUnits(PersistenceBundleTracker.java:90)[38:org.apache.aries.jpa.container:2.3.0]
        at
        
org.apache.aries.jpa.container.impl.PersistenceBundleTracker.addingBundle(PersistenceBundleTracker.java:69)[38:org.apache.aries.jpa.container:2.3.0]
        at
        
org.apache.aries.jpa.container.impl.PersistenceBundleTracker.addingBundle(PersistenceBundleTracker.java:40)[38:org.apache.aries.jpa.container:2.3.0]
        at
        
org.osgi.util.tracker.BundleTracker$Tracked.customizerAdding(BundleTracker.java:469)[org.osgi.core-6.0.0.jar:]
        at
        
org.osgi.util.tracker.BundleTracker$Tracked.customizerAdding(BundleTracker.java:415)[org.osgi.core-6.0.0.jar:]
        at
        
org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:256)[org.osgi.core-6.0.0.jar:]
        at
        
org.osgi.util.tracker.AbstractTracked.trackInitial(AbstractTracked.java:183)[org.osgi.core-6.0.0.jar:]
        at
        
org.osgi.util.tracker.BundleTracker.open(BundleTracker.java:156)[org.osgi.core-6.0.0.jar:]
        at
        
org.apache.aries.jpa.container.impl.Activator.start(Activator.java:43)[38:org.apache.aries.jpa.container:2.3.0]
        at
        
org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:697)[org.apache.felix.framework-5.4.0.jar:]
        at
        
org.apache.felix.framework.Felix.activateBundle(Felix.java:2226)[org.apache.felix.framework-5.4.0.jar:]
        ... 11 more
        Caused by: org.osgi.framework.InvalidSyntaxException: Only one
        top-level operation allowed:
        (&(objectClass=javax.sql.DataSource)(osgi.jndi.service.name
        
<http://osgi.jndi.service.name>=osgi:service/javax.sql.XADataSource/(osgi.jndi.service.name
        <http://osgi.jndi.service.name>=jdbc/filetransferhistoryjta)))
        at
        
org.apache.felix.framework.FilterImpl.<init>(FilterImpl.java:51)[org.apache.felix.framework-5.4.0.jar:]
        at
        
org.apache.felix.framework.BundleContextImpl.createFilter(BundleContextImpl.java:134)[org.apache.felix.framework-5.4.0.jar:]
        at
        
org.apache.aries.jpa.container.impl.DataSourceTracker.createFilter(DataSourceTracker.java:62)[38:org.apache.aries.jpa.container:2.3.0]
        ... 33 more

        It seems like the JNDI search has two top-level operations
        which doesn't seem to be allowed. Looking at the exception it
        looks like one top level operation to me. The operation is "&"
        ("and") and the two expressions that should be "anded"
        together are:

        /(objectClass=javax.sql.DataSource)
        /

        and

        /(osgi.jndi.service.name
        
<http://osgi.jndi.service.name>=osgi:service/javax.sql.XADataSource/(osgi.jndi.service.name
        <http://osgi.jndi.service.name>=jdbc/filetransferhistoryjta))
        /

        But the second expression looks a bit fishy to me although I'm
        not a JNDI expert.


        I assume the expressions has its origins in my persistence.xml:

        /<?xml version="1.0" encoding="UTF-8"?>/
        /<persistence 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"/
        /version="2.0">/
        /<persistence-unit name="filetransferhistoryPU"
        transaction-type="JTA">/
        
/<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>/
        
/<jta-data-source>osgi:service/javax.sql.XADataSource/(osgi.jndi.service.name
        
<http://osgi.jndi.service.name>=jdbc/filetransferhistoryjta)</jta-data-source>/
        
/<non-jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name
        
<http://osgi.jndi.service.name>=jdbc/filetransferhistorynojta)</non-jta-data-source>/
        /<class>se.digia.connect.filetransfer.history.domain.Entry</class>/
        /<class>se.digia.connect.filetransfer.history.domain.FileEntry</class>/
        /<class>se.digia.connect.filetransfer.history.domain.Retry</class>/
        /<class>se.digia.connect.util.persistence.EntityBase</class>/
        /<exclude-unlisted-classes>true</exclude-unlisted-classes>/
        /<validation-mode>NONE</validation-mode>/
        /<properties>/
        /  <property name="openjpa.ConnectionFactoryMode"
        value="managed" />/
        /  <property name="openjpa.jdbc.SynchronizeMappings"
        value="buildSchema(ForeignKeys=true)" />/
        /  <property name="openjpa.jdbc.DBDictionary" value="derby" />/
        /  <property name="openjpa.jdbc.UpdateManager"
        value="operation-order" />/
        /  <property name="openjpa.Log" value="DefaultLevel=WARN,
        Tool=INFO" />/
        /</properties>/
        /</persistence-unit>/
        /</persistence>/

        I have both a <jta-data-source> and a <non-jta-data-source>.
        Is that not supported anymore?

        /Bengt














        2016-07-07 15:28 GMT+02:00 Bengt Rodehav <[email protected]
        <mailto:[email protected]>>:

            OK - I'll try.

            Thanks,

            /Bengt

            2016-07-07 15:22 GMT+02:00 Christian Schneider
            <[email protected] <mailto:[email protected]>>:

                Hmm this could actually explain the problems we see. I
                always wondered why karaf insists to install the 2.1
                version of the jpa spec bundle but this explains it.

                Luckily this should be easy to solve. Try to install
                the OSGi jpa spec bundle:
                
http://search.maven.org/#artifactdetails%7Corg.osgi%7Corg.osgi.service.jpa%7C1.0.0%7Cjar

                It should contain exactly the missing package. I think
                we are missing this bundle in the feature. We just did
                not see it as it is embeded in the jpa 2.1 spec bundle
                we use.
                You could also try to simply add this bundle to the
                persistence-api 2.0.0 feature. Maybe then karaf
                already does the right thing.

                Christian


                On 07.07.2016 15:04, Bengt Rodehav wrote:

                It seems like the or.apache.aries.jpa.container
                requires the package org.osgi.service.jpa (at least
                version 1.0.0) and that package is only provided by
                the JPA 2.1 bundle...

                Hope you understand this a bit better than me but it
                does not seem to be easy to come up with a working
                solution including OpenJPA 2.4.1 in Karar 4.0.5. If
                you have a workaround to try before you get a fix
                inte Karaf 4.0.6 I would be grateful.

                /Bengt



                2016-07-07 14:17 GMT+02:00 Bengt Rodehav
                <[email protected] <mailto:[email protected]>>:

                    OK - thanks a lot for all your help Christian.

                    /Bengt


                    2016-07-07 14:14 GMT+02:00 Christian Schneider
                    <[email protected]
                    <mailto:[email protected]>>:

                        Genereally Aries JPA should work with OpenJPA
                        2.4.1 but I think there is some bug in karaf
                        4.0.5.

                        I just tested again and found that
                        persistence api 2.0 and 2.1 are both
                        installed. This fails as Aries JPA can only
                        bind to one of these and will choose the
                        higher version.
                        As a workaround you should be able to create
                        your own feature copied from the Aries JPA
                        feature but make sure you install the
                        persistence api only in version 2.0.

                        I will try to create a working version of the
                        features for karaf 4.0.6.

                        Christian



                        On 07.07.2016 14:07, Bengt Rodehav wrote:
                        Installing feature "openjpa" also installs
                        JPA 2.0 (version 1.1) so I shouldn't need to
                        install JPA manually as well. However, then
                        I won't get the Aries support for JPA. Feels
                        a bit weird.

                        What Aries JPa version should be used
                        together with OpenJPA 2.4.1?

                        /Bengt

                        2016-07-07 14:04 GMT+02:00 Bengt Rodehav
                        <[email protected] <mailto:[email protected]>>:

                            It seems to be the "jpa" feature that
                            installs JPA 2.1.

                            2016-07-07 13:58 GMT+02:00 Bengt Rodehav
                            <[email protected]
                            <mailto:[email protected]>>:

                                On a fresh Karaf 4.0.5 I do:

                                /la | grep -i jpa/
                                /la | grep -i persistence/

                                Nothing is displayed. I then do:

                                /feature:install openjpa jpa
                                /

                                If I then execute the above commands
                                I get:

                                /karaf@root()> la | grep -i jpa/
/62 | Active | 80 | 2.3.0 | Apache Aries JPA Container API/ /63 | Active | 80 | 2.3.0 | Apache Aries JPA blueprint/ /64 | Active | 80 | 2.3.0 | Apache Aries JPA container/ /65 | Active | 80 | 2.3.0 | Apache Aries JPA support/ /71 | Active | 80 | 1.1 | Apache Geronimo JSR-317 JPA 2.0
                                Spec AP/
/73 | Active | 80 | 2.4.1 | OpenJPA Aggregate Jar/
                                /karaf@root()> la | grep -i persistence/
                                /55 | Active   |  80 |
                                2.1.0.v201304241213 | Java
                                Persistence API 2.1/
                                /karaf@root()>/

                                So JPA 2.1 has indeed been
                                installed. I don't know if this is
                                why I have problems but it still
                                seems strange.

                                /Bengt


                                2016-07-07 13:11 GMT+02:00 Christian
                                Schneider <[email protected]
                                <mailto:[email protected]>>:

                                    Can you start from an empty
                                    karaf 4.0.5 and then do

                                    feature:install openjpa jpa

                                    This should install openjpa
                                    2.4.1 and aries jpa 2.3.0 with
                                    javax.persistence 2.0 and jta 1.2.

                                    This configuration should work.
                                    So maybe something else you
                                    install requires the jpa 2.1 spec.

                                    Christian




                                    On 07.07.2016 10:28, Bengt
                                    Rodehav wrote:
                                    Reading your post again
                                    Christian I realize that I
                                    should not use JPA 2.1 but JPA
                                    2.0.

                                    I seem to have JPA 2.0 and JPA
                                    2.1 installed at runtime:

                                    /karaf@root()> la | grep -i jpa/
                                    / 37 | Active   |  80 | 2.3.0 |
                                    Apache Aries JPA Container API/
                                    / 38 | Active   |  80 | 2.3.0 |
                                    Apache Aries JPA blueprint/
                                    / 39 | Active   |  80 | 2.3.0 |
                                    Apache Aries JPA container/
                                    / 40 | Active   |  80 | 2.3.0 |
                                    Apache Aries JPA support/
                                    / 70 | Active   |  80 | 1.1 |
                                    Apache Geronimo JSR-317 JPA 2.0
                                    Spec API/
                                    /106 | Active   |  80 | 2.4.1 |
                                    OpenJPA Aggregate Jar/
                                    /karaf@root()> la | grep -i
                                    persistence/
                                    / 17 | Active   |  80 |
                                    2.1.0.v201304241213   | Java
                                    Persistence API 2.1/
                                    /175 | Active   |  80 |
                                    2.8.0.SNAPSHOT        | Connect
                                    :: persistence-util/

                                    I don't really know why the JPA
                                    version 2.1
                                    (2.1.0.v201304241213) is being
                                    installed. I do not do this
                                    explicitly.

                                    Looking at OpenJPA 2.4.1, it
                                    seems to depend on JTA 1.1 not
                                    JTA 1.2.

                                    Looked again at my JPA version.
                                    I do use JPA 2.0. But I use
                                    version 1.1 of
                                    artifact geronimo-jpa_2.0_spec
                                    which caused me to believe I
                                    was using JPA 1.1....

                                    I'm still kind of confused. It
                                    would be thankful if you could
                                    tell me what features (and
                                    versions of those features) I
                                    should install in order to use
                                    the latest version (2.4.1) of
                                    OpenJPA.

                                    /Bengt



-- Christian Schneider
                                    http://www.liquid-reality.de

                                    Open Source Architect
                                    http://www.talend.com






-- Christian Schneider
                        http://www.liquid-reality.de

                        Open Source Architect
                        http://www.talend.com





-- Christian Schneider
                http://www.liquid-reality.de

                Open Source Architect
                http://www.talend.com







--
Christian Schneider
http://www.liquid-reality.de

Open Source Architect
http://www.talend.com

Reply via email to