1

私は現在、サービスのバージョン管理を管理するために osgi (felix 4.3 実装を使用) を評価しています。

私は次のバンドルを作成しています:

インターフェイス xyzSomeService を定義する bundle-api (バージョン 1.0.0): バージョン 1.0.0 で xyz をエクスポートします。

SomeService (v 1.0.0) を実装する bundle-impl (バージョン 1.0.0)、仕様バージョン 1.0.0 のパッケージ xyz をインポートし、サービスを登録する

インターフェイス xyzSomeService を定義する bundle-api (バージョン 2.0.0): バージョン 2.0.0 で xyz をエクスポートします。

SomeService (v 2.0.0) を実装し、仕様バージョン 2.0.0 のパッケージ xyz をインポートし、サービスを登録する bundle-impl (バージョン 2.0.0)

現在、バージョン仕様-1.0.0 で bundle-api の xyz をインポートするクライアント、bundle-client (バージョン 1.0.0) があります。

バージョン 1.0.0 で xyzSomeService のサービスを取得するにはどうすればよいですか?

現在、インストール/アクティブ化時: bundle-api 1.0.0 bundle-impl 1.0.0 bundle-api 2.0.0 bundle-impl 2.0.0 bundle-client 1.0.0

bundle-client を起動すると、利用可能な xyySomeService を照会します。利用可能なサービスの回答として取得します: bundle-impl 1.0.0 および bundle-impl 2.0.0

バージョン 1.0.0 に一致するサービス実装のみを取得したいと考えています。

どうすればいいですか?

ps:現在、フィルター値として null を設定しています。

4

3 に答える 3

5

サービスのクエリに使用しているコードまたはメカニズムは何ですか? OSGi はサービス互換性フィルタリングを自動的に提供します。つまり、クライアントがバージョン 1.0 の API をインポートすると、バージョン 1.0 を実装するサービスのみが表示され、クライアントがバージョン 2.0 の API をインポートすると、バージョン 2.0 を実装するサービスのみが表示されます。 ....など

getAllServiceReferences()ただし、この互換性チェックを明示的にオフにするメソッド呼び出しがあり、すべてのバージョンのすべてのサービスを取得するために使用できます。99% の場合、これはやりたいことではありません。を使用している場合はgetAllServiceReferences()、 に変更してみてくださいgetServiceReferences()

他の方法でサービスを検索している場合は、さらに詳しい情報が必要です。

于 2012-05-02T00:44:55.267 に答える
0

できることは、version=1.0.0やversion=2.0.0のようなプロパティでサービスを公開することです。次に、(バージョン= 1.0.0)でサービスをフィルタリングできます。

ニールが述べたようなパッケージバージョンでサービスをフィルタリングする必要があることを私は知りませんでした。ニールは本当にこの分野の専門家なので、彼が正しいと信じています。では、felixの実装にバグがあるのではないでしょうか。

于 2012-05-21T12:52:35.123 に答える
0

サービスは、そのインターフェースの Java パッケージによってバージョン管理されます。OSGi セマンティック バージョニング モデルに従ってそのパッケージを正しくバージョン管理し、対応するパッケージのインポートを行うと、OSGi フレームワークが自動的に選択を行います。すべての OSGi サービスは、この方法でバージョン管理されます。

これを手作業で維持することは、Java コードを手作業でバイトコードにコンパイルするようなものです。そのためのツールがあります。bnd(tools) には、これらのバージョンの処理と検証を最小限に抑えるための広範なサポートがあります。

OSGi の全体的な考え方は、互換性のあるパッケージにのみ公開されるということです。

于 2013-05-03T07:26:23.307 に答える