0

1 つのサービス クラスが 2 つのクライアントで使用される OSGi バンドルがあります。同じバージョンのサービス クラスを使用している両方のクライアントが 1.0 と言います。サービス クラスにいくつかの変更を加え、サービス クラスのバージョンを 1.1 に更新しました。問題は、サービス クラスの両方のバージョンが 1 つのクライアントが使用できることを意味することです。 1.0 バージョンと別のクライアントが 1.1 を使用できます。これをどのように達成できますか? サンプルが動的バージョン管理に提供できる場合、それは私にとって本当に役に立ちます。

ありがとう。

4

2 に答える 2

1

サービスのバージョンは、サービスが実装するインターフェースのバージョンであり、そのインターフェースが存在するエクスポートされたパッケージのバージョンに由来します。

サービスの利用者は実装クラスの知識を持っていないため、サービス実装クラスのバージョンは関係ありません。したがって、同じインターフェースで複数のサービスを登録すると、それらはすべてコンシューマーに表示されます。

于 2012-08-13T21:29:03.547 に答える
1

OSGi にサービス バージョンの実際の概念があるとは思いませんが、サービスを登録するときに好きなキーと値のペアを使用できます。Knopflerfishのチュートリアルはかなり良いと思います。

たとえば、サービスを登録する場合:

Hashtable props = new Hashtable();
props.put("version", "1.0");
bundleContext.registerService(ServiceInterface.class.getName(), impl, props);

次に、サービスを利用するときに、これらの属性を使用して特定の属性を要求できます。

このサービスの複数のバージョンを持つことは非常に簡単ですが、注意が必要な部分は、サービスの利用者がそれをどのように扱うかです。

バージョン 1.0 を使用している 2 つのコンシューマーがあり、1.1 が表示された場合 (たとえば、新しいバンドルが開始された場合)、コンシューマーは 1.0 の使用を停止し、1.1 の使用を開始する必要がありますか? あなたの例では、消費者の 1 人はこれを無視し、もう 1 人は 1.1 に再配線する必要があります。これは、1 人の消費者が複数のサービスを利用する場合に特に複雑になります。

宣言型サービスを検討することをお勧めします。これにより、これがはるかに簡単になり、コードがきれいに保たれます。ここから始めることをお勧めします

于 2012-08-13T15:05:24.843 に答える