0

システム内のデバイスを定義するインターフェースがあります。デバイスは、一度に 1 つのエンティティのみが使用することを意図しています。各デバイスを OSGi サービスとして登録して、他の人がそのメカニズム (Declarative Services またはサービス トラッカーを使用) を介してデバイスにアクセスできるようにしたいと考えています。ただし、私の知る限り、そのメカニズムでは、すべてのエンティティが同じサービスを要求できます。

最初のリクエスタのみがサービスを取得する方法や、Declarative Services を使用して 1 つのサービス コンポーネントのみが満たされる方法はありますか?

4

2 に答える 2

3

ServiceFactory を使用してデバイス サービスを実装します。その後、一意のサービス オブジェクトを各バンドルに返し、そのオブジェクトを使用してアクセスをシリアル化できます。または、現在サービスにアクセスできるバンドルが他にある場合、ServiceFactory は他のバンドルに null を返すことができます。

ServiceFactory を使用すると、サービスの実装で、サービスを使用しているバンドルを認識し、それらの使用をある程度制御できます。

于 2011-08-04T16:34:18.983 に答える
1

知る限り、DS を使用して単一の消費者ポリシーを課すことはできません。

一見したところ、ServiceFactoryは機能する 可能性があり、機能する場合は最も簡単な方法です。

ただし、注意点が 1 つあります。 "The Framework caches the value returned (unless it is null), and will return the same service object on any future call to BundleContext.getService for the same bundle. This means the Framework must not allow this method to be concurrently called for the same bundle"

したがって、次のシナリオでは失敗すると思います。

Given Bundle A, Service S and Bundle B;
A gets S, then A ungets S, Bgets S, then A gets S.

フレームワークのキャッシュが干渉し、キャッシュされた S が既に B によって保持されている場合でも、A に与える可能性があります。

私が考えることができる唯一の代替手段は、FindHookを使用することですが、これはもう少し低レベルですが、完全を期すために他のフック(EventHook、ListenerHook) を実装することをお勧めします。

フックを使用すると、サービスの可用性を他のバンドルに隠すことができます。ただし、フックは状態を保持するため、デバイス サービスのバンドルを停止せずにフックを停止できないように、デバイス サービスと同じバンドルにする必要があります。

于 2011-08-04T17:12:00.397 に答える