Hi

I have two OSGi bundles The first one contains only a Blueprint data source 
definition:

====================
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0";>

  <bean id="dataSource" class="org.h2.jdbcx.JdbcDataSource">
    <property name="URL" value="jdbc:h2:db/database" />
  </bean>

  <service interface="javax.sql.DataSource" ref="dataSource">
    <service-properties>
      <entry key="osgi.jndi.service.name" value="jdbc/database" />
    </service-properties>
  </service>

</blueprint>
====================

The second bundle contains a JPA persistence file and a blueprint file:

====================
<persistence xmlns="http://java.sun.com/xml/ns/persistence";
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; version="1.0">

  <persistence-unit name="CaptureAgentCore" transaction-type="JTA">
    <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
    
<jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/database)</jta-data-source>
    <class>ch.entwine.captureagent.scheduler.RecordingEvent</class>
    <class>ch.entwine.captureagent.config.ConfigOption</class>
    <class>ch.entwine.captureagent.felix.configadmin.ConfigurationData</class>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>
  </persistence-unit>

</persistence>

<blueprint default-activation="eager"
  xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
  xmlns:jpa="http://aries.apache.org/xmlns/jpa/v1.0.0"; 
xmlns:tx="http://aries.apache.org/xmlns/transactions/v1.0.0";>

  <bean id="SchedulerService" 
class="ch.entwine.captureagent.scheduler.Scheduler">
    <jpa:context property="entityManager" unitname="CaptureAgentCore" />
    <tx:transaction method="*" value="Required" />
  </bean>

  <service ref="SchedulerService" 
interface="ch.entwine.captureagent.scheduler.Scheduler" depends-on="dataSource" 
/>
</blueprint>
====================

I ran into the problem that the data source is not yet registered when the JPA 
entity manager tries to get a reference to it. Error message:

2012-04-19 16:17:38 ERROR (DelayedLookupDataSource:57) No JTA datasource could 
be located using the JNDI name 
osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/database)
javax.naming.NameNotFoundException: 
osgi:service/javax.sql.DataSource/"(osgi.jndi.service.name=jdbc/database)"

I've now tried to set the 'depends-on' attribute on the SchedulerService 
definition in the blueprint file of bundle two (see above). Unfortunately I get 
the following error now:

17:19:09 ERROR (BlueprintContainerImpl:348) Unable to start blueprint container 
for bundle ch.entwine.matterhorn.core
org.osgi.service.blueprint.container.ComponentDefinitionException: Unresolved 
ref/idref to component: dataSource

So, my question is how I can make sure the data source gets registered before 
the JPA entity manager gets started?


Thanks for your help!
-- 
Basil


Reply via email to