OSGI 中的服务激活导致超时

Service activation in OSGI results in Time out

使用 blueprint.xml,我正在尝试为数据源创建一个 jndi 服务并在同一 bundle.The 中引用一个数据源服务未激活并且引用在一定时间后失败并导致暂停。 此外,当在蓝图中注释服务引用时,该服务将被激活。 有没有一种方法可以处理服务的激活,其引用也存在于同一个包中。

<service id="zDS" interface="javax.sql.DataSource" ref="zOltpDataSource">
    <service-properties>
        <entry key="osgi.jndi.service.name" value="jdbc/zDS"/>
    </service-properties>  
</service>
<bean id="zDao"
    class="com.h.h.common.dao.ZDaoImpl">
    <property name="dataSource" ref="dataSource" />
</bean> 
<reference id="dataSource" interface="javax.sql.DataSource"
             filter="(osgi.jndi.service.name=jdbc/zDS)">
</reference>  

   <bean id="zOltpDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${z.driverClassName}"/>
    <property name="url" value="${z.url}"/>
    <property name="username" value="${z.username}"/>
    <property name="password" value="${z.password}"/>      
    <property name="initialSize" value="${z.initialSize}"/>
    <property name="maxIdle" value="${z.maxIdle}"/>
    <property name="maxActive" value="${z.maxActive}"/>
    <property name="validationQuery" value="${z.validationQuery}"/>
    <property name="testOnBorrow" value="${z.testOnBorrow}"/>
</bean>

蓝图容器在满足其所有强制依赖项之前不会初始化:请参阅蓝图规范中的Initialization of a Blueprint Container

因此,您不能对仅从同一容器发布的服务使用 <reference>,因为实际上存在循环依赖。当然,如果有来自另一个包的匹配 DataSource 服务,您的容器将启动。

但是,您不需要参考该服务。只需将 zOltpDataSource bean 直接注入 zDao bean,如下所示:

<bean id="zDao"
    class="com.h.h.common.dao.ZDaoImpl">
    <property name="dataSource" ref="zOltpDataSource" />
</bean>