Hi users of the world's best application server ever ;-),
I'm struggling with feature resolution, and would like to have your POV.
This issue is concerning, the JDBC, the Blueprint and the transactional
feature.
Here's the issue with feature resolution in my pax-exam test:
* The jdbc-pool-aries feature starts first (+ the config one and the cfg
\o/).
* Then the transactional feature
* The third feature thats start is the aries jndi one, so the two
datasources (the XA and non-XA ones) are exposed (\o/\o/).
* But the third that starts is the blueprint one, which starts the
xbean-blueprint bundle.
That blueprint bundle restarts the 'optional' resolutions of aries
transaction manager, which then restarts aries-jdbc modules (optional res
again) & config, which stops the datasource and starts another one.
Unfortunately, at this point, my 'daos' bundle is already linked with a
proxy to the 'old' datasource.
A way to fix it is to reference the 'transaction' feature in the
'pool-aries' one, and the 'blueprint' one in the 'transaction' one, but it
would then break some modularity.
Have you got an idea on how to properly handle it?
The actual xml of my features, they're slightly similar to the karaf ones,
with bundle versions aligned:
[code]
<feature name="osgiliath-pax-jdbc-pool-aries"
description="Provides JDBC Pooling DataSourceFactory using Aries
Transaction JDBC"
version="${org.ops4j.pax.jdbc_pax-jdbc-features.version}"
resolver="(obr)">
<feature>osgiliath-pax-jdbc-spec</feature>
<bundle>mvn:org.ops4j.pax.jdbc/pax-jdbc-pool-common/${org.ops4j.pax.jdbc_pax-jdbc-pool-common.version}</bundle>
<bundle>mvn:org.ops4j.pax.jdbc/pax-jdbc-pool-aries/${org.ops4j.pax.jdbc_pax-jdbc-pool-aries.version}</bundle>
<conditional>
<condition>osgiliath-aries-blueprint</condition>
<bundle
dependency="true">mvn:org.apache.xbean/xbean-blueprint/${org.apache.xbean_xbean-blueprint.version}</bundle>
</conditional>
<conditional>
<condition>osgiliath-transaction</condition>
<bundle
dependency="true">mvn:org.apache.aries.transaction/org.apache.aries.transaction.jdbc/${org.apache.aries.transaction_org.apache.aries.transaction.jdbc.version}</bundle>
</conditional>
</feature>
<feature name="osgiliath-transaction" description="OSGi
Transaction Manager"
version="${org.apache.aries.transaction_org.apache.aries.transaction.manager.version}">
<config name="org.apache.aries.transaction" append="false">
aries.transaction.recoverable = true
aries.transaction.timeout = 600
aries.transaction.howl.logFileDir = ${karaf.data}/txlog
aries.transaction.howl.maxLogFiles = 2
aries.transaction.howl.maxBlocksPerFile = 512
aries.transaction.howl.bufferSize = 4
</config>
<feature version="${transaction-api_feature.version}"
prerequisite="false"
dependency="false">osgiliath-transaction-api</feature>
<bundle
dependency="true">mvn:org.apache.aries/org.apache.aries.util/${org.apache.aries_org.apache.aries.util.version}</bundle>
<bundle>mvn:org.apache.aries.transaction/org.apache.aries.transaction.manager/${org.apache.aries.transaction_org.apache.aries.transaction.manager.version}</bundle>
<conditional>
<condition>osgiliath-aries-blueprint</condition>
<bundle
dependency="true">mvn:org.apache.felix/org.apache.felix.coordinator/${org.apache.felix_org.apache.felix.coordinator.version}</bundle>
<bundle>mvn:org.apache.aries.transaction/org.apache.aries.transaction.blueprint/${org.apache.aries.transaction_org.apache.aries.transaction.blueprint.version1}</bundle>
<bundle>mvn:org.apache.aries.transaction/org.apache.aries.transaction.blueprint/${org.apache.aries.transaction_org.apache.aries.transaction.blueprint.version}</bundle>
<bundle
dependency="true">mvn:org.apache.xbean/xbean-blueprint/${org.apache.xbean_xbean-blueprint.version}</bundle>
</conditional>
<conditional>
<condition>osgiliath-spring</condition>
<feature
version="${org.apache.servicemix.bundles.spring.version}"
dependency="true">osgiliath-spring-tx</feature>
</conditional>
</feature>
********************************************************* Additional
informations ******************************************
<feature name="osgiliath-transaction-api"
version="${transaction-api_feature.version}">
<bundle
dependency="true">mvn:javax.interceptor/javax.interceptor-api/${javax.interceptor_javax.interceptor-api.version}</bundle>
<bundle
dependency="true">mvn:org.apache.geronimo.specs/geronimo-atinject_1.0_spec/${org.apache.geronimo.specs_geronimo-atinject_1.0_spec.version}</bundle>
<bundle
dependency="true">mvn:javax.el/javax.el-api/${javax.el_javax.el-api.version}</bundle>
<bundle
dependency="true">mvn:javax.enterprise/cdi-api/${javax.enterprise_cdi-api.version}</bundle>
<bundle>mvn:javax.transaction/javax.transaction-api/${javax.transaction_javax.transaction-api.version}</bundle>
</feature>
<feature name="osgiliath-persistence-api" description="Persistence
API" version="${persistence-api_feature.version}">
<bundle>mvn:org.apache.geronimo.specs/geronimo-jpa_2.0_spec/${org.apache.geronimo.specs_geronimo-jpa_2.0_spec.version}</bundle>
<bundle>mvn:org.apache.geronimo.specs/geronimo-osgi-registry/${org.apache.geronimo.specs_geronimo-osgi-registry.version}</bundle>
</feature>
<feature name="osgiliath-jpa" description="OSGi Persistence
Container" version="${org.apache.aries.jpa.version}">
<feature version="${transaction-api_feature.version}"
prerequisite="false"
dependency="false">osgiliath-transaction-api</feature>
<feature version="${persistence-api_feature.version}"
prerequisite="false"
dependency="false">osgiliath-persistence-api</feature>
<bundle
dependency="true">mvn:org.apache.felix/org.apache.felix.coordinator/${org.apache.felix_org.apache.felix.coordinator.version}</bundle>
<bundle
dependency="true">mvn:org.osgi/org.osgi.service.jdbc/${org.osgi_org.osgi.service.jdbc.version}</bundle>
<bundle>mvn:org.apache.aries.jpa/org.apache.aries.jpa.api/${org.apache.aries.jpa_org.apache.aries.jpa.api.version}</bundle>
<bundle>mvn:org.apache.aries.jpa/org.apache.aries.jpa.container/${org.apache.aries.jpa_org.apache.aries.jpa.container.version}</bundle>
<bundle>mvn:org.apache.aries.jpa/org.apache.aries.jpa.support/${org.apache.aries.jpa_org.apache.aries.jpa.support.version}</bundle>
<conditional>
<condition>osgiliath-aries-blueprint</condition>
<bundle>mvn:org.apache.aries.jpa/org.apache.aries.jpa.blueprint/${org.apache.aries.jpa_org.apache.aries.jpa.blueprint.version}</bundle>
</conditional>
</feature>
<feature name="osgiliath-openjpa" description="Apache OpenJPA
2.4.x persistence engine support"
version="${org.apache.openjpa.version}">
<feature prerequisite="false"
dependency="false">osgiliath-jndi</feature>
<feature version="${transaction-api_feature.version}"
prerequisite="false"
dependency="false">osgiliath-transaction-api</feature>
<feature version="${persistence-api_feature.version}"
prerequisite="false"
dependency="false">osgiliath-persistence-api</feature>
<bundle
dependency="true">mvn:javax.servlet/javax.servlet-api/${javax.servlet_javax.servlet-api.version}</bundle>
<bundle
dependency="true">mvn:javax.el/javax.el-api/${javax.el_javax.el-api.version}</bundle>
<bundle
dependency="true">mvn:commons-lang/commons-lang/${commons-lang_commons-lang.version}</bundle>
<bundle
dependency="true">mvn:commons-collections/commons-collections/${commons-collections_commons-collections.version}</bundle>
<bundle
dependency="true">mvn:commons-pool/commons-pool/${commons-pool_commons-pool.version}</bundle>
<bundle
dependency="true">mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.commons-dbcp/${org.apache.servicemix.bundles_org.apache.servicemix.bundles.commons-dbcp.version}</bundle>
<bundle
dependency="true">mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.ant/${org.apache.servicemix.bundles_org.apache.servicemix.bundles.ant.version}</bundle>
<bundle
dependency="true">mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.serp/${org.apache.servicemix.bundles_org.apache.servicemix.bundles.serp.version}</bundle>
<bundle
dependency="true">mvn:org.apache.geronimo.specs/geronimo-jms_1.1_spec/${org.apache.geronimo.specs_geronimo-jms_1.1_spec.version}</bundle>
<bundle
dependency="true">mvn:org.apache.xbean/xbean-asm5-shaded/${org.apache.xbean_xbean-asm5-shaded.version}</bundle>
<bundle>mvn:org.apache.openjpa/openjpa/${org.apache.openjpa_openjpa.version}</bundle>
</feature>
<feature name="osgiliath-connector"
version="${org.apache.geronimo.components_geronimo-connector.version}"
description="OSGi Support for JCA Connector 1.6" resolver="(obr)">
<feature
version="${org.apache.aries.transaction_org.apache.aries.transaction.manager.version}">osgiliath-transaction</feature>
<bundle
dependency="true">mvn:org.apache.geronimo.specs/geronimo-j2ee-connector_1.6_spec/${org.apache.geronimo.specs_geronimo-j2ee-connector_1.6_spec.version}</bundle>
<bundle
dependency="true">mvn:javax.validation/validation-api/${javax.validation_validation-api.version}</bundle>
<bundle>mvn:org.apache.geronimo.components/geronimo-connector/${org.apache.geronimo.components_geronimo-connector.version}</bundle>
</feature>
<feature name="osgiliath-jpa" description="OSGi Persistence
Container" version="${org.apache.aries.jpa.version}">
<feature version="${transaction-api_feature.version}"
prerequisite="false"
dependency="false">osgiliath-transaction-api</feature>
<feature version="${persistence-api_feature.version}"
prerequisite="false"
dependency="false">osgiliath-persistence-api</feature>
<bundle
dependency="true">mvn:org.apache.felix/org.apache.felix.coordinator/${org.apache.felix_org.apache.felix.coordinator.version}</bundle>
<bundle
dependency="true">mvn:org.osgi/org.osgi.service.jdbc/${org.osgi_org.osgi.service.jdbc.version}</bundle>
<bundle>mvn:org.apache.aries.jpa/org.apache.aries.jpa.api/${org.apache.aries.jpa_org.apache.aries.jpa.api.version}</bundle>
<bundle>mvn:org.apache.aries.jpa/org.apache.aries.jpa.container/${org.apache.aries.jpa_org.apache.aries.jpa.container.version}</bundle>
<bundle>mvn:org.apache.aries.jpa/org.apache.aries.jpa.support/${org.apache.aries.jpa_org.apache.aries.jpa.support.version}</bundle>
<conditional>
<condition>osgiliath-aries-blueprint</condition>
<bundle>mvn:org.apache.aries.jpa/org.apache.aries.jpa.blueprint/${org.apache.aries.jpa_org.apache.aries.jpa.blueprint.version}</bundle>
</conditional>
</feature>
<feature name="osgiliath-openjpa" description="Apache OpenJPA
2.4.x persistence engine support"
version="${org.apache.openjpa.version}">
<details>Enable Apache OpenJPA as persistence engine.</details>
<feature prerequisite="false"
dependency="false">osgiliath-jndi</feature>
<feature version="${transaction-api_feature.version}"
prerequisite="false"
dependency="false">osgiliath-transaction-api</feature>
<feature version="${persistence-api_feature.version}"
prerequisite="false"
dependency="false">osgiliath-persistence-api</feature>
<bundle
dependency="true">mvn:javax.servlet/javax.servlet-api/${javax.servlet_javax.servlet-api.version}</bundle>
<bundle
dependency="true">mvn:javax.el/javax.el-api/${javax.el_javax.el-api.version}</bundle>
<bundle
dependency="true">mvn:commons-lang/commons-lang/${commons-lang_commons-lang.version}</bundle>
<bundle
dependency="true">mvn:commons-collections/commons-collections/${commons-collections_commons-collections.version}</bundle>
<bundle
dependency="true">mvn:commons-pool/commons-pool/${commons-pool_commons-pool.version}</bundle>
<bundle
dependency="true">mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.commons-dbcp/${org.apache.servicemix.bundles_org.apache.servicemix.bundles.commons-dbcp.version}</bundle>
<bundle
dependency="true">mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.ant/${org.apache.servicemix.bundles_org.apache.servicemix.bundles.ant.version}</bundle>
<bundle
dependency="true">mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.serp/${org.apache.servicemix.bundles_org.apache.servicemix.bundles.serp.version}</bundle>
<bundle
dependency="true">mvn:org.apache.geronimo.specs/geronimo-jms_1.1_spec/${org.apache.geronimo.specs_geronimo-jms_1.1_spec.version}</bundle>
<bundle
dependency="true">mvn:org.apache.xbean/xbean-asm5-shaded/${org.apache.xbean_xbean-asm5-shaded.version}</bundle>
<bundle>mvn:org.apache.openjpa/openjpa/${org.apache.openjpa_openjpa.version}</bundle>
</feature>
<feature name='osgiliath-persistence' version='${project.version}'
resolver="(obr)" start-level="41" description="Java persistence API
stack" >
<bundle
dependency='true'>mvn:javax.servlet/javax.servlet-api/${javax.servlet_javax.servlet-api.version}</bundle>
<feature version="${project.version}">osgiliath-jdbc</feature>
<feature
version="${org.apache.geronimo.components_geronimo-connector.version}">osgiliath-connector</feature>
<feature
version="${org.apache.aries.jpa.version}">osgiliath-jpa</feature>
<bundle
dependency='true'>mvn:org.osgi/org.osgi.service.jpa/${org.osgi_org.osgi.service.jpa.version}</bundle>
<feature
version="${org.apache.openjpa.version}">osgiliath-openjpa</feature>
<feature
version="${org.apache.karaf.features_standard.version}">osgiliath-aries-blueprint</feature>
<bundle>mvn:org.apache.xbean/xbean-reflect/${org.apache.xbean_xbean-reflect.version}</bundle>
<feature
version="${project.version}">osgiliath-spring-data-jpa</feature>
<conditional>
<condition>osgiliath-rest-management</condition>
<bundle start-level="35"
dependency="true">mvn:io.swagger/swagger-annotations/${io.swagger_swagger-annotations.version}</bundle>
</conditional>
</feature>
[/code]
Best regards, and keep up bringing the OSGI dream comes true ;-)
--
Charlie Mordant
Full OSGI/EE stack made with Karaf:
https://github.com/OsgiliathEnterprise/net.osgiliath.parent