問題タブ [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.

0 投票する
2 に答える
3348 参照

java - 宣言型サービス コンポーネントの満足と不満足の両方

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

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

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

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

0 投票する
2 に答える
1022 参照

osgi - 宣言型サービス。サービスが非アクティブ化された場合、そのサービスへの参照はいつ削除されますか?

他のコンポーネント (B と呼ばれる) によって参照されるサービス A がある場合、B の A への参照はどの時点で null になりますか?

・Aのdeactivateメソッドが呼ばれる前?

・Aのdeactivateメソッドを呼んだら終了?

-オブジェクトのインスタンスが破棄された後?

大要仕様を確認しましたが、これに関する詳細は見つかりませんでした。誰かが私のためにそれを明確にすることができれば、私は感謝します.

また、サービスAがアクティブ化されたとき、Bへの参照としていつ注入されますか? activate メソッドの前後?

0 投票する
1 に答える
3431 参照

java - Apache Felix SCR @Referenceチートシート

私は自分のアプリケーションで Apache Felix 宣言型サービスを使用しており、@Reference注釈に与えることができるパラメーターを説明するチート シートを探しています。それに関する非常に有益なチート シート (または表) を含む Web ページを見たことがありますが、見つけられないようです。これは、多くの Felix ユーザーにとって役立つと思います。私が話しているパラメータ:

  • カーディナリティ:MANDATORY_UNARY, MANDATORY_MULTIPLE, OPTIONAL_UNARY, OPTIONAL_MULTIPLE
  • 戦略:EVENT, LOOKUP
  • ポリシー:DYNAMIC, STATIC
  • ポリシーオプション:GREEDY, RELUCTANT

カーディナリティはかなり単純ですが、他のものは私にはわかりません。彼らは何をし、どのように機能しますか?

0 投票する
2 に答える
286 参照

service - OSGi: ライフサイクル管理なしのサービス バインディング

私は Equinox OSGi フレームワークで Java アプリケーションを構築しており、DS (宣言型サービス) を使用して、参照および提供されるサービスを宣言しています。これまで実装してきたすべてのサービス コンシューマーはたまたまサービス プロバイダーでもあったため、(1 つのコンシューマーにアタッチするのではなく、複数のコンシューマーが再利用できるように) それらをステートレスにするのは当然のことでした。フレームワークによってインスタンス化されます(デフォルトのコンストラクター、私のコードのどこにも呼び出されません)。

MyClassここで、別の状況があります。サービスを参照するクラスがありますMyServiceが、それ自体はサービス プロバイダーではありません。MyClassOSGi フレームワークにインスタンス化させるのではなく、自分自身をインスタンス化できる必要があります。次に、フレームワークが既存のMyServiceインスタンスをインスタンスに渡すようにしMyClassます。このようなもの:

私の最初の試みは、DS を使用してコンポーネント定義を作成し、そこからMyClass参照することでした。MyService

ただし、MyClassライフサイクルを管理したくないため、実際にはコンポーネントではありません。インスタンス化を自分で処理したいのです。ニール・バートレットがここで指摘しているように:

たとえば、コンポーネントが特定のサービスに「依存している」と言うことができます。この場合、コンポーネントはそのサービスが利用可能な場合にのみ作成およびアクティブ化され、サービスが利用できなくなると破棄されます。

これは私が望むものではありません。ライフサイクル管理のないバインディングが必要です。[: カーディナリティを0..1(オプションで単項) に設定しても、フレームワークはインスタンス化を試みますMyClass(引数のないコンストラクタがないため失敗します)]

それで、私の質問: DS を使用して、私が探しているこの「バインドのみ、ライフサイクル管理なし」の機能を使用する方法はありますか? DS でこれが不可能な場合、代替手段は何ですか? また、何をお勧めしますか?


更新: 使用ServiceTracker(Neil Bartlett が提案)

重要: 回答として、これの改良版を以下に投稿しました。私はこれを「歴史的」な目的のためにここに置いています。

ServiceTrackerこの場合の申請方法がわかりません。以下に示すように、静的レジストリを使用しますか?

これはあなたがそれを行う方法ですか?そして、上記のコメントで私が書いた質問についてコメントしていただけますか? あれは:

  1. Setサービスの実装が適切に実装されていない場合の問題equalshashCode.
  2. 競合状態:チェックにサービスが非アクティブになる可能性があります。isActive
0 投票する
1 に答える
981 参照

osgi - 特定のインターフェイスを実装するすべてのコンポーネントを参照するにはどうすればよいですか?

Eclipse Equinox OSGi 環境で Apache Felix Service Component Runtime (SCR) を使用しています。

org.example.Producer次のようなインターフェイスを実装する宣言されたコンポーネントがいくつかあります。

org.example.Producerここで、別のコンポーネントで、インターフェイスを動的に実装するすべてのコンポーネントを参照したいと思います。

しかし、これは実行時にエラーになります。SCR の検索フィルターにコンポーネント名が含まれているようです。

エラー メッセージでわかるように、名前が のコンポーネントを明示的に検索していますorg.example.Producer。ただし、上記のコンポーネントにはその名前 ( org.example.ProducerAorg.example.ProducerB) はありません。

問題は、名前を無視して特定のインターフェイスの実装を提供するコンポーネントを動的に参照するにはどうすればよいかということです。

0 投票する
1 に答える
295 参照

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.」が表示されるはずです)。どんな助けでも大歓迎です。

最後に、プロジェクトのディレクトリ構造は次のとおりです。