2017-08-07 2 views
0

KarafからOSGi宣言型サービスを使用する際に、コンポーネントのロードに問題があります。宣言的なサービスに関する複数の参照と依存性

私はこのような状況があります

@Component 
public class A implements IA 
{ 
    doSomething() {...} 
} 


@Component 
public class B implements IB 
{} 

@Component 
public class C implements IC 
{ 
    @Reference 
    IA a 

    @Reference 
    (cardinality = ReferenceCardinality.MULTIPLE, 
    policyOption = ReferencePolicyOption.GREEDY, 
    unbind = "doUnRegister") 
    void doRegister(IB b) 
    { 
    a.doSomething() 
    } 

    void doUnregister(IB b) 
    { 
    ... 
    } 
} 

A、B、及びCは、3本の異なる束です。

Karafを起動すると、Bが登録され、doRegisterが呼び出されます。ただし、サービスAは準備ができていません(aはヌルです)。

私は次のことを試してみました:

  1. がBよりも低く、何かのスタートレベルを設定し...仕事リストにピックアップにBの登録を
  2. を仕事と実際に使用していませんでした後でCが活性化された。うまくいかず、コードが乱雑になった。
  3. は、doRegisterの注釈でこの要件を書き込む方法を探しました - できません。
  4. 私はサービスロケータを使用しようとしましたが、Cの起動メソッドでコンテキストを取得しようとしました - 動作しなかった、Karafをクラッシュしました。

明らかに何か不足している必要がありますか、同様の問題を経験して解決策を見つけた人はいますか?

更新: 参照a IAに変更されました。参照B()に関する忘れた情報を追加しました。 ABへの言及は、静的、必須の参照であるので、あなたが提供するサンプルコード、CABまで活性化することが習慣に基づいて

+0

サンプルクラスは完成していますか?多分Bはインプリメントされていて、インターフェイスはありませんか? –

+0

指摘してくれてありがとう。しかし、はいA、B、およびCはインターフェイスによってバックアップされており、問題は残ります。 –

+0

githubなどの完全な小さな例を投稿できますか? –

答えて

0

が存在します。開始順序は関係ありません。

また、コンポーネント記述XMLに記述されている順序で参照が設定されています。 Bndが注釈をコンポーネント記述XMLに処理すると、参照名で参照を順番に書き出します。参照名は明示的に設定することができ、デフォルトは注釈付きメンバーの名前になります。だから、あなたのコード例ではadoRegisterの前に来るので、フィールドadoRegisterが呼び出される前に設定されます。

私の推測では、実際のコードをこの例に減らすために、問題を理解するために重要な情報が失われていると思います。これには、参照の名前と同様に静的/動的および必須/オプションの性質が含まれます。

+0

UPDATE:サンプルプログラムを更新して、参照アノテーションの詳細とインターフェイスの正しい使い方を更新しました。 –

+0

ReferenceCardinality.MULTIPLEは0..nです。したがって、コンポーネントCがコンポーネントBの前に開始すると、CのリファレンスはゼロBによってうまく満足されます。また、コンポーネントCの生成されたコンポーネント記述XMLを見ると、フィールドAの参照要素がバインド・メソッドdoRegisterの参照要素の前に来るはずです。これは、Aがバインドされ、BがバインドされてdoRegisterが呼び出される前にセットをフィールドすることを意味します。 –

関連する問題