問題タブ [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.
osgi - OSGi DS:FelixSCR@Referenceアノテーションを使用してバインド解除メソッドを省略します
OSGi宣言型サービスは、「コンポーネント構成が非アクティブ化されると、SCRは、アクティブ化に関連付けられたコンポーネントインスタンスおよびコンポーネントコンテキストへのすべての参照を破棄する必要がある」ため、参照に一致するunbindメソッドなしでbindメソッドを持つことが明示的に許可されます。
Apache Felix maven-scr-pluginを使用して、Java5アノテーションからサービスコンポーネントXMLを生成しています。@Referenceアノテーションから「unbind」属性を省略すると、次のエラーが発生します。
SCRジェネレータが非常に厳しいのはなぜですか?省略されたバインド解除メソッドを許容するように指示する方法はありますか?おそらく私はFelixに欠陥を提出する必要がありますか?
もちろん、簡単なバインド解除メソッドをサービスに追加するのは簡単ですが、仕様ではそれらは不要であるとされています。
osgi - OSGi で一度に 1 つのものだけがサービスにアクセスできるようにする方法はありますか?
システム内のデバイスを定義するインターフェースがあります。デバイスは、一度に 1 つのエンティティのみが使用することを意図しています。各デバイスを OSGi サービスとして登録して、他の人がそのメカニズム (Declarative Services またはサービス トラッカーを使用) を介してデバイスにアクセスできるようにしたいと考えています。ただし、私の知る限り、そのメカニズムでは、すべてのエンティティが同じサービスを要求できます。
最初のリクエスタのみがサービスを取得する方法や、Declarative Services を使用して 1 つのサービス コンポーネントのみが満たされる方法はありますか?
java - JUnit テストのコンテキストでの OSGi 宣言型サービスの使用
JUnit を使用して OSGi でマルチバンドル統合テストを実装する方法を理解しようとしています。
統合テストとは、バンドルのサブセットをインスタンス化して、そのサブシステムの機能を自動的に検証することを意味します。
Equinox を実行し、ツールチェーンとして Eclipse を使用しています。Eclipse は、OSGi フレームワークを起動し、configures バンドルをインスタンス化する「Run as JUnit Plug-in」オプションを提供しているため、これが従うべきパスだと思いますが、DS 参照をテストに挿入する方法が見つかりません。さまざまなサービス バンドルにアクセスするためのプログラムによる手段として ServiceTracker を使用しているのを見てきましたが、それは DS を使用する目的よりも優れていますね。
私は OSGI を使い始めたばかりなので、マルチバンドル テストをまとめるためのパズルのピースが欠けているだけだと思います。
何か案は?
ありがとう、ジェラルド。
*編集:解決策*
この問題をさらに詳しく調べた結果、JUnit プラグイン機能を使用して、このマルチバンドル統合テストを配置する方法を最終的に見つけました。
動的サービス インジェクションを機能させるには、DS を使用するときに通常行われるように、インジェクトされた依存関係を宣言する必要があるサービス定義ファイルを作成する必要があります。このファイルは (通常)OSGI-INF/
ディレクトリの下にあります。例えばOSGI-INF/service.xml
service.xml は、このテストに必要な依存関係を宣言する必要がありますが、独自のサービスは提供しません。
これにより、宣言された onServiceUp メソッドを使用して FooService への依存関係を挿入するよう DS に指示されます。onServiceDown は、テスト実行後の OSGi シャットダウン フェーズ中に呼び出されるので、実装する必要があります。
com.test.functionaltest.MyTester には、典型的な JUnit プラクティスに従って実行されるテスト メソッドが含まれています。
ここまでは、すべて「本による」です。それでも、Junit が実行されると、FooService への参照にアクセスするときに NullPointerException がスローされます。その理由は、OSGi フレームワークが JUnit テスト ランナー コンテキストと競合状態にあり、通常は Junit テスト ランナーがその競合に勝ち、必要なサービスへの参照が挿入される前にテストを実行するためです。
この状況を解決するには、OSGi ランタイムがその作業を行うまで Junit テストを待機させる必要があります。テストで必要な依存サービスの数に初期化される CountDownLatch を使用して、この問題に対処しました。次に、すべての依存性注入メソッドがカウントダウンし、すべてが完了すると、テストが開始されます。コードは次のようになります。
fooService
OSGi と JUnit の実行コンテキスト間でサービス参照を共有できるようにするには、参照を静的にする必要があることに注意してください。CountDownLatch は、この共有参照を安全に発行するための高レベルの同期メカニズムを提供します。
次に、テスト実行前に依存関係チェックを追加する必要があります。
このようにして、Junit フレームワークは OSGi DS サービスが依存関係を注入するのを待つか、タイムアウト後に失敗します。
これを完全に理解するのにかなりの時間がかかりました。将来、仲間のプログラマーの頭痛の種が減ることを願っています。
eclipse - OSGi宣言型サービス-bindメソッドでServiceReferenceを取得します
Eclipse3.7とEclipseGeminiJPA/DBAccessを使用しています。EntityManagerBuilderFactoryを参照する宣言型ServiceComponentを実装しました。bindメソッドは次のようになります。
ただし、このサービスのプロパティを取得するには、次のようなServiceReferenceが必要です。
ServiceRegistryでこのServiceReferenceを検索する必要がありますか、それともより洗練されたアプローチがありますか?
乾杯、ムキ
java - OSGi 宣言型サービスを介して has-a 依存関係を宣言するにはどうすればよいですか?
私の OSGi アプリケーションは、ホワイトボード パターンを使用して、特定の状態変化のリスナーを登録します。宣言型 XML を手作業でコーディングする代わりに、org.apache.felix.scr.annotations を使用してサービスとコンポーネントを宣言します。コンポーネントを ChangeListener として登録する最も簡単な方法は次のとおりです。
これは is-a 関係であり、私のコンポーネントを要求した人に公開します。代わりに、内部クラスを介して ChangeListener を登録する has-a 関係が必要です。しかし、以下は上記と比較すると非常に醜いです。
それほど冗長ではないが、内部クラスの情報隠蔽を実現する、含まれているリスナーを実装するより良い方法はありますか?
eclipse - OSGi 宣言型サービスを使用してサービス実装のリストを取得する
宣言型サービスの非常に単純な例があります。私はこのチュートリアルhttp://www.eclipsezone.com/eclipse/forums/t97690.html?start=0に従っています。すべてが期待どおりに機能しています。ただし、「SampleImporter」(他のバンドルのサービスを使用することが期待されるバンドル) に「SampleExporter」(サービスを提供するバンドル) のリストを認識させる方法がわかりません。つまり、「SamlpeImporter」が最終的に使用するバンドルの ID を確認する必要があります。この情報は、私のアプリケーションに非常に役立ちます。
SampleExporter の XML ファイルは次のとおりです。
一方、SampleImporter の場合:
インポーター側には、次の機能があります。
}
これはうまくいきますが、プロパティの値を取得したい場合は、
また
エクスポーターのメソッド run は呼び出されません。つまり、バインド関数 (setRunnable は呼び出されません) は呼び出されません。また、ss と ls を使用すると、コンポーネント eporter が「満足」していることがわかります。私の実装の何が問題になっていますか?
前もって感謝します
乾杯
マリー
service - OSGi サービス - ベスト プラクティス
私は OSGi サービスをますます好きになり、より多くのコンポーネントをサービスとして実現したいと考えています。特にUIコンポーネントのベストプラクティスを探しています。
リスナーとの関係については、ホワイトボード パターンを使用します。これは、IMHO の意見が最良のアプローチです。ただし、通知以上のものが必要な場合は、3 つの解決策が考えられます。
次のシナリオを想像してください。
[1] ホワイトボードパターン - セルフ設定サービス付き
新しいサービス インターフェイスを作成します。
このようなbindConsumerメソッドを使用して宣言型の IDatabaseService コンポーネントを作成します
このアプローチは、IDatabaseService が 1 つしかないことを前提としています。
[更新]使用法は次のようになります。
[2] クラスをサービスにする
みたいなクラスをイメージ
public class DatabaseEntryViewer は TableViewer を拡張します
ここで、IDatabaseService のバインド/バインド解除メソッドを追加し、component.xml を追加して、DatabaseEntryViewer を追加するだけです。このアプローチでは、引数のないコンストラクターがあり、OSGi-Service-Factory を介して UI コンポーネントを作成することを前提としています。
[3] 従来の方法: ServiceTracker
Activator に静的な ServiceTracker を登録してアクセスする従来の方法。トラッカーを使用するクラスは、ダイナミックを処理する必要があります。
現在、私は最初のアプローチを支持しています。このアプローチはオブジェクトの作成を複雑にせず、Activator を無限の静的な ServiceTracker から保存するからです。
osgi - OSGi とコンポーネント管理
OSGi を使用して実行時にモジュラー機能をロードする動的アプリケーションがあります。OSGi バンドルにはモジュラー機能が含まれており、アプリケーションは必要なときにバンドルをロードします。このアプローチは問題なく機能しますが、より詳細なソリューションが必要です。バンドルには、Declarative Services によって制御されるコンポーネントが含まれています。バンドルをロードして、バンドル内で必要なコンポーネントのみを有効にしたいと考えています。この分野で調査を行いましたが、満足のいく解決策が見つかりません。1 つのアプローチは、バンドル内で常に有効な「ゲートキーパー」コンポーネントを作成し、ComponentContext を介して有効化および無効化コンポーネントを呼び出すことでした。これは実行可能な解決策ですが、「ゲートキーパー」が「知る」方法がわかりませんでした。
私が好むのは、バンドルをロードし、ロードされたバンドル内のすべてのコンポーネントを「知る」方法です。コンポーネントがどのバンドルにあり、現在どのような状態にあるかを判断できます (すべてのコンポーネントを一覧表示する equinox コンソール コマンド 'ls' に似ています)。必要に応じてコンポーネントを有効または無効にしたいと考えています。
コンソールはどのようにこれを行い、アプリケーションでこれをどのように行うことができますか?
更新: @Neil Bartlett: 遅れてすみません。私は別のことに移らなければなりませんでした。今、私はこの問題に戻ります。さらなるご支援をいただければ幸いです。私のアプリケーションはロールベースです。コンポーネントが提供する機能に基づいてコンポーネントを有効にする必要があります。目標は、すべての役割ベースのコンポーネントを最初に無効にすることです。ロールが変更されると、ロール マネージャは、提供されている機能について各コンポーネントをポーリングし、それをロードするかどうかを決定します。各コンポーネントは、提供する機能を (共通のサービス インターフェイスを介して) ブロードキャストします。ScrService では、最初に無効にしたサービス コンポーネントを有効にすることはできません。コンポーネントを最初に有効にし、ScrService がアプリケーションの起動時にできるだけ早くコンポーネントを無効にできるようにするのは、私のニーズには合いません。
soap - 宣言型サービスのコンポーネント定義で異なる ECF 配布プロバイダーを設定する方法は?
ECF に存在するすべてのリモート サービス プロバイダー (または少なくとも一般的なプロバイダー: ジェネリック、r-osgi、SOAP、REST) のパフォーマンスをテストする必要があるため、あるプロバイダーから別のプロバイダーに簡単な方法で変更することは非常に役立ちます。 .
component.xml ファイルで一部のプロバイダーのエンドポイントの説明を設定する方法を知っています。たとえば、Generic の場合は次のとおりです。
「service.exported.configs」を「ecf.r_osgi.peer」などの他の名前に変更すると、コードを再コンパイルすることなく、問題なくプロバイダーが変更されます。
また、「containerfactoryargs」プロパティにはいくつかの違いがあります (たとえば、前の例ではecftcp://をr-osgi://に変更しています。ただし、プロバイダーの一覧には、この違いに関する例は他にありません。プロバイダー (たとえば、SOAP をどのように使用しますか? このプロバイダーのサービス プロパティはどれですか?)
さらに、Restlet を使用することは (たとえば、サービスのソース コードを変更して @Get("text") アノテーションを追加することを意味します。ここで説明します) 。それでは、サービスのコードにアノテーションを追加して、Restful サービスまたは SOAP サービスとして公開する義務がありますか? サービスに「押し付けがましい」コードを追加したり、別のメソッド (ConfigurationLoader など) からのアクティブ化を可能な限り避けたいと考えています。
では、すべての (または少なくとも最も一般的な) 配布プロバイダーのコンポーネント定義ファイルの例を含む情報ページはありますか? または、ソースを再コンパイルせずにプロバイダーを変更する最もエレガントな方法はどれですか? おそらく、前に述べたように、ConfigurationLoader サービスを使用してプロパティを変更するのでしょうか?
前もって感謝します!
java - Eclipse / Equinox:インストールされているすべてのプラグインを起動しますか?
機能を使用してEclipse製品をビルドしています。すべてのサービスは、宣言型サービスを介して登録されます。私が理解しているように、サービスコンポーネントランタイムが各バンドルで公開されているサービスを取得して登録するには、バンドルを開始する必要があります。
OSGiランタイムにインストールされているすべてのバンドルを自動的に開始したい。これを行う簡単な方法はありますか?私が見つけることができるのは、[製品]>[構成]>[開始レベル]>[自動開始]オプションだけです。機能に移動してグループ化し、同様のバンドルを一緒に開始したかったので、これをすべての製品ビルドで行う必要はありません。
これを行うための簡単な/推奨される方法はありますか?