問題タブ [declarative-services]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 宣言型サービス コンポーネントの満足と不満足の両方
宣言型サービスを使用してコンポーネントを定義する OSGI ベースのシステムを開発しています。ただし、Eclipse から実行すると、コンポーネントの 1 つが初期化されません。簡単なコンソール コマンドを使用して問題を調査したところ、次のような出力が得られました (若干難読化されています)。
したがって、コンポーネントにはがありますstate = Unsatisfied
が、動的情報は、コンポーネントが満たされ、そのコンポーネント参照も満たされていることを示しています。
誰でもこれを説明できますか?コンポーネントが初期化されないのはなぜですか?
更新:どうやら、immedate="true"
コンポーネントの設定により、初期化の問題が修正されます。ただし、 osgi コマンドにはまだありstate = Unsatisfied
ます。理由を知っている人はいますか?
osgi - 宣言型サービス。サービスが非アクティブ化された場合、そのサービスへの参照はいつ削除されますか?
他のコンポーネント (B と呼ばれる) によって参照されるサービス A がある場合、B の A への参照はどの時点で null になりますか?
・Aのdeactivateメソッドが呼ばれる前?
・Aのdeactivateメソッドを呼んだら終了?
-オブジェクトのインスタンスが破棄された後?
大要仕様を確認しましたが、これに関する詳細は見つかりませんでした。誰かが私のためにそれを明確にすることができれば、私は感謝します.
また、サービスAがアクティブ化されたとき、Bへの参照としていつ注入されますか? activate メソッドの前後?
java - Apache Felix SCR @Referenceチートシート
私は自分のアプリケーションで Apache Felix 宣言型サービスを使用しており、@Reference
注釈に与えることができるパラメーターを説明するチート シートを探しています。それに関する非常に有益なチート シート (または表) を含む Web ページを見たことがありますが、見つけられないようです。これは、多くの Felix ユーザーにとって役立つと思います。私が話しているパラメータ:
- カーディナリティ:
MANDATORY_UNARY, MANDATORY_MULTIPLE, OPTIONAL_UNARY, OPTIONAL_MULTIPLE
- 戦略:
EVENT, LOOKUP
- ポリシー:
DYNAMIC, STATIC
- ポリシーオプション:
GREEDY, RELUCTANT
カーディナリティはかなり単純ですが、他のものは私にはわかりません。彼らは何をし、どのように機能しますか?
service - OSGi: ライフサイクル管理なしのサービス バインディング
私は Equinox OSGi フレームワークで Java アプリケーションを構築しており、DS (宣言型サービス) を使用して、参照および提供されるサービスを宣言しています。これまで実装してきたすべてのサービス コンシューマーはたまたまサービス プロバイダーでもあったため、(1 つのコンシューマーにアタッチするのではなく、複数のコンシューマーが再利用できるように) それらをステートレスにするのは当然のことでした。フレームワークによってインスタンス化されます(デフォルトのコンストラクター、私のコードのどこにも呼び出されません)。
MyClass
ここで、別の状況があります。サービスを参照するクラスがありますMyService
が、それ自体はサービス プロバイダーではありません。MyClass
OSGi フレームワークにインスタンス化させるのではなく、自分自身をインスタンス化できる必要があります。次に、フレームワークが既存のMyService
インスタンスをインスタンスに渡すようにしMyClass
ます。このようなもの:
私の最初の試みは、DS を使用してコンポーネント定義を作成し、そこからMyClass
参照することでした。MyService
ただし、MyClass
ライフサイクルを管理したくないため、実際にはコンポーネントではありません。インスタンス化を自分で処理したいのです。ニール・バートレットがここで指摘しているように:
たとえば、コンポーネントが特定のサービスに「依存している」と言うことができます。この場合、コンポーネントはそのサービスが利用可能な場合にのみ作成およびアクティブ化され、サービスが利用できなくなると破棄されます。
これは私が望むものではありません。ライフサイクル管理のないバインディングが必要です。[注: カーディナリティを0..1
(オプションで単項) に設定しても、フレームワークはインスタンス化を試みますMyClass
(引数のないコンストラクタがないため失敗します)]
それで、私の質問: DS を使用して、私が探しているこの「バインドのみ、ライフサイクル管理なし」の機能を使用する方法はありますか? DS でこれが不可能な場合、代替手段は何ですか? また、何をお勧めしますか?
更新: 使用ServiceTracker
(Neil Bartlett が提案)
重要: 回答として、これの改良版を以下に投稿しました。私はこれを「歴史的」な目的のためにここに置いています。
ServiceTracker
この場合の申請方法がわかりません。以下に示すように、静的レジストリを使用しますか?
これはあなたがそれを行う方法ですか?そして、上記のコメントで私が書いた質問についてコメントしていただけますか? あれは:
Set
サービスの実装が適切に実装されていない場合の問題equals
とhashCode
.- 競合状態:チェック後にサービスが非アクティブになる可能性があります。
isActive
osgi - 特定のインターフェイスを実装するすべてのコンポーネントを参照するにはどうすればよいですか?
Eclipse Equinox OSGi 環境で Apache Felix Service Component Runtime (SCR) を使用しています。
org.example.Producer
次のようなインターフェイスを実装する宣言されたコンポーネントがいくつかあります。
org.example.Producer
ここで、別のコンポーネントで、インターフェイスを動的に実装するすべてのコンポーネントを参照したいと思います。
しかし、これは実行時にエラーになります。SCR の検索フィルターにコンポーネント名が含まれているようです。
エラー メッセージでわかるように、名前が のコンポーネントを明示的に検索していますorg.example.Producer
。ただし、上記のコンポーネントにはその名前 ( org.example.ProducerA
、org.example.ProducerB
) はありません。
問題は、名前を無視して特定のインターフェイスの実装を提供するコンポーネントを動的に参照するにはどうすればよいかということです。
osgi - bndtools を使用して Declarative Services (DS) コンポーネントを起動できない
Eclipse 用の標準のbndtoolsプラグインをインストールし、apache felix osgi ランタイムを実行しています。宣言型サービス (DS) コンポーネントについて学習しようとしています。どうやら、アノテーション (bndtools のチュートリアルで例が示されています) が存在する前は、コンポーネントは xml データを使用して記述されていました。それが私がやろうとしていることです。
以下は単純なクラスです (DS コンポーネントとして公開されます): "HelloComponent.java"
コンポーネント宣言を行う xml ファイルは次のとおりです: 「minimal.xml」
そして、最終的に OSGi ランタイムに発行される jar ファイルを生成するために bndtools によって使用されることになっている .bnd ファイルは次のとおりです: "minimal_ds.bnd"
ホスト ランタイム OSGi コンテナーで次のバンドルを実行していることに注意してください。
すべてがアクティブに実行されているにもかかわらず、DS コンポーネントが初期化されていない理由がわかりません (コンソール出力「HelloComponent created.」が表示されるはずです)。どんな助けでも大歓迎です。
最後に、プロジェクトのディレクトリ構造は次のとおりです。