2012-05-12 10 views
2

私の現在のアプリケーションでは、このパターンをいくつかの場所で実行しました。異なるが関連するジョブを行う単一のバンドル内に2つのサービス・インターフェースがあります。OSGiコンポーネント・モデルのバンドル内およびバンドル相互依存性

interface Service1 { ... } 

interface Service2 { ... } 

との両方を実装するシングルトンコンポーネントを持っていますが、それぞれが他への参照を必要とする見つけたい:

これを許可3つのOSGiのコンポーネントモデルの(DS、青写真、およびiPOJO)
public class Service1Impl implements Service1 { 

    private Service2 service2; 
    ... 

} 

public class Service2Impl implements Service2 { 

    private Service1 service1; 
    ... 

} 

:1)Service1ImplService2Implが同じバンドルに入っている場合。 2)彼らが異なるバンドルにいるとき?

答えて

5

宣言型サービス仕様、バージョン1.1:

112.3.5循環参照

それは循環依存関係を作成するためのコンポーネントの記述のセットが可能です。例えば、 コンポーネントAがコンポーネントBによって提供されるサービスを参照し、 コンポーネントBがコンポーネントAによって提供されるサービスを参照する場合、 は他の コンポーネントの部分的にアクティブ化されたコンポーネントインスタンスにアクセスすることなく、1つのコンポーネントのコンポーネント構成を満たすことができません。 SCRは、 が完全にアクティブ化されるまで、つまりアクティブメソッド が返されるまで、コンポーネントインスタンスが他のコンポーネントインスタンスまたはサービスとしてアクセスできないようにします。存在する場合、サイクルに関与する参照を満たし、ログサービスのエラーメッセージ ログコンポーネント構成を満足するとSCRが に失敗しなければならない場合に 試み

循環参照は、SCRにより検出されなければなりません。しかし、 の参照の1つにオプションの基数がある場合、SCRはサイクルを中断する必要があります。オプションのカーディナリティーを持つ の参照を満たすことができ、 ゼロのサービスにバインドされます。したがって、サイクルが壊れ、他の 参照が満たされることがあります。

Blueprint仕様では、依存関係サイクルの少なくとも1つのメンバーがプロパティであり引数ではないものを指定していることを明示的に許可しています(121.2。6つの循環依存は):サイクルのメンバーは、コンポーネントのインスタンスを提供するように要求された場合

、 Blueprintコンテナーは、サイクルのメンバーに1つの破断部材を見つけることによって悪循環を断ち切る必要があります。壊れたメンバーは、サイクルを引き起こす依存関係のためにプロパティー注入 を使用する必要があります。青写真コンテナは、 が見つからない場合、初期化が失敗するか、またはgetComponentInstanceメソッドがコンポーネント定義例外をスローする必要がある場合、メンバーを壊すためにサイクルの任意の適切なメンバを と指定できます。

壊れたメンバーは、オブジェクトの提供を依頼されたときに、部分的に初期化されたコンポーネントインスタンス を返す必要があります。部分的に初期化されたオブジェクトは、すべて の可能な初期化を行っていますが、initMethod( が指定されている場合)でまだ呼び出されておらず、サイクルを引き起こすプロパティーも注入されていません。 部分的に初期化されたコンポーネントインスタンスのファイナライズは、サイクルのすべての参照メンバにブレークメンバが挿入されるまで、 を遅延させる必要があります。ファイナライゼーションとは未設定のプロパティをすべて注入し、initMethodが指定されていればそれを呼び出すことを意味します。

部分的に初期化されたコンポーネントインスタンスの結果は、すべてのプロパティが設定される前に を使用することができるため、このアプリケーションには を認識する必要があります。

ブループリントコンテナがランタイムフェーズに入る前で、 getComponentInstanceメソッドの呼び出しによってコンポーネントインスタンスが返される前に、部分的に初期化されたコンポーネントインスタンスをすべてファイナライズする必要があります。 getComponentInstanceメソッドを再帰的に呼び出すことによって動的サイクルが発生するユーザーコード が検出され、エラーが発生する必要がある場合、これらの サイクルは中断できません。

検出されたすべてのサイクルを記録する必要があります。あなたの特定の状況がサポートされているiPOJO

について

。私は他の状況のた​​めに話すことができません しかし、それ以上の説明を知らなくても。

(回答はメーリングリストで受け取りました)。

3

厳密に言えば、循環依存のため、あなたが言っていることは不可能です。

Service1はService2がアクティブな場合にのみ機能し、その逆もあります。したがって、フレームワークがサービスを開始できる順序はありません。

です。サービス参照の1つをオプションにすると機能し、サービスを注入する前にサービスを提供できるので、他のserviceimplはそのサービスを返すことができます。

3つのフレームワークすべてでこれを行うことができます。 iPojoにはoptional references、DSにはサービス要件のカーディナリティ設定があります(1..1ではなく、オプションの参照で0..1を使用)。青写真私はよくそれを知らないが、私はそれを行うことができると確信しています。

よろしく、フランク

+0

"Service1はService2がアクティブになると機能し、その逆もあります。したがって、フレームワークがサービスを開始できる順序はありません。"フレームワークはそれらを公開せずに両方のインスタンスを作成することができます(クライアントコードで呼び出すことはできず、参照の欠如は問題ではありません)。または、他のインスタンスへの参照なしに1つのインスタンスを公開し、2番目のインスタンスが作成されるまで、すべての呼び出しをブロックすることもできます。例えば。これは '@ Autowired' Spring Beanでうまく動作します。 –

+0

DS仕様を見ると、実際にはこの状況でもう一方のサービスが提供されていません(112.3.5を参照)。 –

+0

この場合、iPOJOには時間的な依存性もあります。 – Clement

関連する問題