This all looks pretty good.

One thing I just found recently is that you need to separate the persistence unit bundle and the bundle injecting the EntityManager. It will not work if both are in the same bundle.... at least not with blueprint - with ds this seems to work.

Christian

Am 30.11.2015 um 19:07 schrieb Jason Reilly:


On 11/30/2015 12:33 PM, Christian Schneider wrote:
No idea why the namespace handler does not seem to be present.

You can look through the bundles with la -s and check if the transaction blueprint 2.0.0 bundle is present.

karaf@root()> la -s | grep transaction

 31 | Active   |  80 | 1.2                     | javax.transaction-api

59 | Active | 80 | 1.1.1 | org.apache.aries.transaction.blueprint

60 | Active | 80 | 2.0.0 | org.apache.aries.transaction.blueprint

61 | Active | 80 | 1.3.0 | org.apache.aries.transaction.manager


You can then do bundle:service -p <id> to see which services it offers. It should offer the correct blueprint namespace handler.

karaf@root()> bundle:services -p 60

Apache Aries Transaction Blueprint (60) provides:

-------------------------------------------------

objectClass = [org.osgi.service.blueprint.container.BlueprintContainer]

osgi.blueprint.container.symbolicname = org.apache.aries.transaction.blueprint

osgi.blueprint.container.version = 2.0.0

service.bundleid = 60

service.id = 201

service.scope = singleton

----

objectClass = [org.apache.aries.blueprint.NamespaceHandler]

osgi.service.blueprint.compname = nsHandler

osgi.service.blueprint.namespace = http://aries.apache.org/xmlns/transactions/v2.0.0

service.bundleid = 60

service.id = 273

service.scope = bundle


That all looks good.

If just the EntityManager is missing then maybe the DataSource is not present or the persistence unit bundle is not correctly identified. You should see in the log if a persistence unit is found in a bundle and what it is waiting for.

I am deploying the datasource as a bundle & seems to be registered fine:

karaf@root()> service:list javax.sql.DataSource

[javax.sql.DataSource]

----------------------

 osgi.jndi.service.name = hearsayNoJTA

 osgi.service.blueprint.compname = hearsay-ds-no-jta

 service.bundleid = 268

 service.id = 269

 service.scope = bundle

Provided by :

 Hearsay :: Datasource (268)

[javax.sql.DataSource]

----------------------

 osgi.jndi.service.name = hearsayJTA

 osgi.service.blueprint.compname = hearsay-ds-jta

 service.bundleid = 268

 service.id = 270

 service.scope = bundle

Provided by :

 Hearsay :: Datasource (268)


The persistence.xml file has the following:

  <persistence-unit name="hearsay" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>

<jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=hearsayJTA)</jta-data-source> <non-jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=hearsayNoJTA)</non-jta-data-source>


I think this configuration all lines up, so I am leaning towards the "persistence unit bundle is not correctly identified" idea. The dao impl bundle finally fails with the following exception:

2015-11-30 12:25:48,287 | ERROR | rint Extender: 2 | BlueprintContainerImpl | 39 - org.apache.aries.blueprint.core - 1.4.5 | Unable to start blueprint container for bundle hearsay-dao-jpa/0.0.46.SNAPSHOT due to unresolved dependencies [(&(osgi.unit.name=hearsay)(objectClass=javax.persistence.EntityManager))]

java.util.concurrent.TimeoutException

at org.apache.aries.blueprint.container.BlueprintContainerImpl$1.run(BlueprintContainerImpl.java:343)[39:org.apache.aries.blueprint.core:1.4.5]

at org.apache.aries.blueprint.utils.threading.impl.DiscardableRunnable.run(DiscardableRunnable.java:48)[39:org.apache.aries.blueprint.core:1.4.5]


Is there something else I should be looking for?

Thanks,
Jason


Reply via email to