【问题标题】:Service activation in OSGI results in Time outOSGI 中的服务激活导致超时
【发布时间】:2019-01-25 05:04:20
【问题描述】:

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

<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>

【问题讨论】:

  • 您已经跳过了蓝图 XML 的重要部分:bean zOltpDataSource 是在哪里定义的?
  • 将 bluprint 中的 zOltpDa​​taSource 添加到代码部分。

标签: osgi apache-karaf blueprint-osgi


【解决方案1】:

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

因此,您不能将&lt;reference&gt; 用于仅从同一容器发布的服务,因为实际上存在循环依赖。当然,如果另一个包中存在匹配的 DataSource 服务,您的容器将启动。

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

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

【讨论】:

  • 感谢尼尔的详细解释。我将数据源作为服务的想法也是在其他捆绑包中使用数据源。我可以将数据源移动到新捆绑包中以立即公开服务,或者在此捆绑包中为其他捆绑包声明服务,然后将数据源注入这个捆绑包。
  • 您可以将数据源导出为服务,并且仍然可以像 Neil 建议的那样直接注入数据源 bean。因此,您的 bundle 将启动,并且其他 bundle 也可以通过服务使用数据源。
  • 感谢克里斯蒂安·施耐德。我知道如果我们直接注入数据源并导出为其他捆绑包的服务,那么循环依赖将被移除。我采取了不同的方法,因为我们处于微服务环境中,并创建了一个轻量级捆绑包,仅用于将数据源导出为服务。现在,所有包都希望按照 feature.xml 中的说明安装此数据源包,并使用此服务的引用来注入数据源。
猜你喜欢
  • 2016-04-06
  • 2018-07-11
  • 2020-11-02
  • 2011-01-01
  • 2019-08-31
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
相关资源
最近更新 更多