Активация услуги в OSGI приводит к истечению времени ожидания - PullRequest
0 голосов
/ 25 января 2019

Используя 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>

1 Ответ

0 голосов
/ 25 января 2019

Контейнер Blueprint не будет инициализирован до тех пор, пока не будут выполнены все его обязательные зависимости: см. Инициализация контейнера Blueprint из спецификации Blueprint.

Следовательно, вы не можете использовать <reference> для службы, которая публикуется только из того же контейнера, поскольку фактически существует циклическая зависимость. Конечно, ваш контейнер запустится, если есть соответствующая DataSource служба из другого пакета.

Однако вам не нужно обращаться к услуге. Просто введите боб zOltpDataSource непосредственно в боб zDao следующим образом:

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