2

宣言型サービスを使用してコンポーネントを定義する OSGI ベースのシステムを開発しています。ただし、Eclipse から実行すると、コンポーネントの 1 つが初期化されません。簡単なコンソール コマンドを使用して問題を調査したところ、次のような出力が得られました (若干難読化されています)。

osgi> component 51
    Component[
    name = com.e.location.view
    activate = activate
    deactivate = deactivate
    modified = 
    configuration-policy = optional
    factory = null
    autoenable = true
    immediate = false
    implementation = com.e.location.view.LocationViewContribution
    state = Unsatisfied
    properties = 
    serviceFactory = false
    serviceInterface = [com.e.model.ViewContribution]
    references = {
        Reference[name = SpecificationProvider, interface = com.e.SpecificationProvider, policy = static, cardinality = 1..1, target = null, bind = setSpecificationProvider, unbind = null]
    }
    located in bundle = com.e.location.view_1.0.0.SNAPSHOT [107]
]
Dynamic information :
  The component is satisfied
  All component references are satisfied
  Component configurations :
    Configuration properties:
      component.name = com.e.location.view
      component.id = 55
      objectClass = String[com.e.model.ViewContribution]
    Instances:

したがって、コンポーネントにはがありますstate = Unsatisfiedが、動的情報は、コンポーネントが満たされ、そのコンポーネント参照も満たされていることを示しています。

誰でもこれを説明できますか?コンポーネントが初期化されないのはなぜですか?

更新:どうやら、immedate="true"コンポーネントの設定により、初期化の問題が修正されます。ただし、 osgi コマンドにはまだありstate = Unsatisfiedます。理由を知っている人はいますか?

4

2 に答える 2

3

次の場合にも同様の問題がありました。

  • コンポーネントの activate メソッドが例外をスローしました (ログを参照)
  • コンポーネントの activate メソッドが返されませんでした (スレッド ダンプを参照してください)。
    • activate での無限ループ (または JVM 拡張再帰)
    • デッドロック

Equinox にいて、LogEvents をログファイル/コンソールに転送するバンドルをインストールしていない場合は、構成ディレクトリを確認することを忘れないでください。ここに、equinox はエラー メッセージのログ ファイルを配置します。

于 2014-12-12T15:18:53.583 に答える
0

コンポーネントのコンストラクターには引数を指定してはならないことに注意してください。

また、タグenabled="true" immediate="true"内の属性を使用して強制的に有効にします。<scr:component>

于 2015-04-22T09:05:28.990 に答える