2017-12-13 20 views
0

OSGI Blueprintを初めて使用し、奇妙な問題に直面しています。Osgi Blueprintでサービスを動的にバインドできません。

私は2つの別々のデータベースを持っている:オラクルと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です。

これで、後で構成ファイルを編集して値を変更したいとしますH2タイプにdatasource.typeの、そして私のサービス-refは下記のBeanにバインドする必要があります。

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

我々は青写真における動的結合のような種類を行うことができますか?

基本的に、私はサービスロケータに似た何かを探しています。

+0

DataSourceサービスを提供する場所では、「」要素が表示されていますが、サービスを使用する場所(通常は別のバンドルのもの)には「」要素は表示されていません。それは、潜在的に複数の候補となるDataSourceサービスを区別するための ' 'にあるので、それを示してください。 –

+0

はい、別のバンドルからサービスを利用しています。 ** ** のための** **要素 しかし、私は要件が多少異なると思うので、私はH2データソースを私の** **私はpax統合テストを実行するたびに** pax統合テスト以外のものについては、oracleデータソースを** ** – Sandy

+0

にバインドしたいのですがなぜ? '要素は、バンドル内から固定Beanを取り出してサービスとしてエクスポートすることを意味します。これは、注入するBean自体ではありません。統合テストでは、Oracleの代わりにH2を使用して 'DataSource'を提供するバンドルを使用します。 –

答えて

1

Blueprintの<service>要素は、注入対象のBeanではありません。唯一の目的は、同じBlueprintコンテナ(つまりOSGiバンドル)内から固定Beanを取り出し、いくつかのプロパティを持つサービスとしてエクスポートすることです。

あなたが望む柔軟性を導入するための正しい場所は、別のバンドルの要素、つまりサービスを利用する場所の<reference>要素です。

したがって、javax.sql.DataSourceサービスを提供する2つのバンドルを持つことができます。 1つはOracleで実装され、もう1つはH2で実装されます。統合テストのシナリオでは、H2実装バンドルを使用し、Oracle実装バンドルを省略します。プロダクションでは、、逆の場合はです。明確化のため

UPDATE

消費者のバンドル内の<reference>要素が実際に...私はすでに存在している上記の柔軟性を変更する必要はありません。ここでは、現在、どこかに持っている参照です(infererred、あなたが実際に指定されていない):

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

これはタイプDataSourceのいずれかのサービスにバインドし、関係なく、その背後にある実装の。 Oracleバンドルのみをデプロイすると、コンシューマはOracleデータソースを取得します。 H2バンドルだけをデプロイすると、消費者はH2データソースを取得します。消費者は変更する必要はありません。これはOSGiサービスの美しさです。

+0

あなたの貴重なご意見ありがとうございました。 私はunあなたがどこから来ているのか理解していますが、設計上の欠陥だと思っていますし、後でこのバンドルに依存している他のすべてのバンドルに変更が影響するため、合意しなければなりません。 これは、既存のblueprint.xmlファイルに** **要素をもう1つ導入することをお勧めしますか?例: Sandy

+0

これは設計上の欠陥で、なぜ他のバンドルへの影響があるのでしょうか?実際には影響はありません。それらは単に 'DataSource'サービスにバインドされ、 –

+0

2つめの質問については、それほど良い考えではありません。OracleとH2の別々のプロバイダバンドルを使用すると、それぞれのバンドルは使用するJDBCドライバに依存することになります。 OracleとH2の両方に接続する方法を知っているバンドルが1つあります。これはモジュール設計が貧弱なことです –

関連する問題