2017-12-13 1077 views
0

OSGI Blueprint를 처음 접했고 이상한 문제가 있습니다.Osgi 청사진에서 서비스를 동적으로 바인드 할 수 없습니다.

나는이 별도의 데이터베이스가 오라클과 H2 청사진 컨테이너는 다음과 같은 형태

DB를 (테스트에 사용되는) :

<service ref='oracleDataSource' interface='javax.sql.DataSource'> 
    <service-properties> 
     <entry key='osgi.jndi.service.name' value='someJndiDatasourceName'/> 
    </service-properties> 
</service> 

<bean id='oracleDataSource' 
     class="CustomDataSourceImpl"> 
    <property name="connectionFactoryClassName" value="${datasource.type}"/> 
    <property name="url" value="${url}"/> 
    <property name="user" value="${username}"/> 
    <property name="password" value="${password}"/> 
    <property name="validateConnectionOnBorrow" value="true"/> 
</bean> 

분명히,이 서비스는 위의 oracleDataSource에 결합한다. datasource.type 특성은 구성 파일에서 채워지고 값이 oracle.jdbc.pool.OracleDataSource입니다.

이제는 구성 파일을 편집하고 값을 변경하려는 경우를 가정합니다

<bean id="h2ds" class="org.h2.jdbcx.JdbcDataSource"> 
    <property name="URL" value="${url}"/> 
    <property name="user" value="${username}"/> 
    <property name="password" value="${password}"/> 
</bean> 

우리는 청사진에 동적 바인딩 같은 종류의 작업을 수행 할 수 있습니다 H2 타입 datasource.type의 다음 내 서비스 심판 아래에 언급 된 콩에 결합해야 하는가?

기본적으로 나는 서비스 탐지기와 비슷한 것을 찾고 있습니다.

+0

DataSource 서비스를 제공 할 때 ''요소 만 표시되었지만 일반적으로 다른 번들의 서비스를 사용하는 곳에 ''요소가 표시되지 않았습니다. 잠재적으로 복수의 후보 DataSource 서비스를 구별 할 수있는 ''에 있기 때문에 표시하십시오. –

+0

예, 다른 번들에서 서비스를 사용하고 있습니다. ** ** 에 대한 ** ** 요소 그러나 요구 사항이 다소 다르다고 생각하지만 H2 데이터 소스를 내 ** ** pax 통합 테스트를 실행할 때마다 ** pax 통합 테스트 이외의 다른 모든 경우, oracle 데이터 소스를 ** ** ** – Sandy

+0

에 바인드하고 싶습니다. 왜? ' 요소는 번들 내에서 고정 된 bean을 가져 와서 서비스로 내보내는 것을 의미합니다. 여러분이 주입하는 bean 자체가 아닙니다. 통합 테스트에서 Oracle 대신 H2를 사용하여'DataSource'를 제공하는 번들을 사용합니다. –

답변

1

청사진의 <service> 요소는 사용자가 주입하려는 bean이 아닙니다. 유일한 청사진 컨테이너 (즉, OSGi 번들) 내에서 고정 빈을 가져 와서 서비스로 내보내고 일부 속성을 사용하는 것이 유일한 목적입니다.

원하는 유연성을 소개하는 올바른 위치는 다른 번들의 요소 인 <reference>에 있습니다. 즉, 서비스를 사용하는 지점입니다.

따라서 javax.sql.DataSource 서비스를 제공하는 번들 두 개를 가질 수 있습니다. 하나는 Oracle로 구현되고, 다른 하나는 H2로 구현됩니다. 통합 테스트 시나리오에서는 H2 구현 번들을 사용하고 Oracle 구현 번들을 생략합니다. 프로덕션에서는 , 반대의 경우는입니다. 설명에 대한

UPDATE :

소비자 번들의 <reference> 요소는 실제로 변경할 필요가 없습니다

... 내가 위에서 언급 한 유연성은 이미 존재합니다. 여기에 현재 어딘가에있는 참조입니다 (infererred, 실제로 지정하지 않은) :

<reference id="dataSourceService" 
    interface="javax.sql.DataSource"/> 

이 유형 DataSource의 모든 서비스 결합에 관계없이 그 뒤에 구현. Oracle 번들 만 배포하면 소비자가 Oracle 데이터 소스를 가져옵니다. H2 번들 만 배포하면 소비자가 H2 데이터 소스를 가져옵니다. 소비자는 OSGi Services의 아름다움 인 바꿀 필요가 없습니다.

+0

감사합니다. 닐 감사합니다. I un 당신이 어디서 오는지 알지만, 디자인 상 결함이 있다고 생각합니다. 나중에이 번들에 의존하는 다른 모든 번들에 변경 사항이 적용되므로 나중에 동의해야합니다. 그렇다면 ** 기존의 blueprint.xml 파일에 ** ** 요소를 하나 더 추가하는 것이 좋습니다. 예 : ' – Sandy

+0

이것은 왜 디자인 상 결함이며 다른 번들에 어떤 영향을 미칠까요? 실제로 영향이 없으며 단지 'DataSource' 서비스에 바인딩되어 있어야합니다. 제공 번들에 관심이 없음 –

+0

두 번째 질문에 대해서는별로 좋은 생각이 아닙니다. 별도의 Oracle 및 H2 공급자 번들을 사용하면 각 번들은 사용하는 JDBC 드라이버에만 의존 할 수 있습니다. 오라클과 H2에 모두 연결하는 방법을 알고있는 하나의 번들이 있습니다. 이는 열악한 모듈 디자인입니다. –