2011-08-04 8 views
0

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

宣言型サービスは、唯一のサービスコンポーネントが満足になってい使用してサービスまたはを取得する唯一の最初の要求者のための方法はありますか?

答えて

3

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

は、あなたのサービスの実装がバンドルがサービスを使用していて、その使用をある程度制御を発揮するかを知ることができます。

1

AFAIKでは、DSを使用して1つのコンシューマポリシーを適用することはできません。

一見してServiceFactoryかもしれないかもしれませんし、もしそれができれば最も簡単な方法です。

は、しかし1 caveatがあります: "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が干渉し、与える可能性もそれはすでにあると思いました

私が考えることのできる唯一の代替案は、FindHookを使用することですが、これはもう少し低レベルですが、完全性のために他のhooks(EventHook、ListenerHook)。あなたが他のバンドルへのサービスの可用性をマスクすることができますフックを使用して

。あなたのフックは状態を保持するので、デバイスサービスと同じバンドルに入れたいので、デバイスサービスのバンドルを止めることなくフックを止めることは不可能です。

+0

標準も述べて:私はそれが問題になるとは考えていないので、「バンドルは、サービスの使用を解放するまでのServiceFactoryで返されるサービスオブジェクトは、フレームワークによってキャッシュされています」。 –

+0

バンドルが毎回新しいインスタンスとサービスを同時に消費する必要がある場合はどうなりますか? どうすれば対応できますか? – Ravish

+1

こんにちは@Ravz、私はニールの答え、私はこの質問に答えてComponentFactoryの例を持ってあなたの質問を参照してくださいhttp://stackoverflow.com/questions/7033222/osgi-using-servicefactories/7080234#7080234 HTH – earcam

関連する問題