問題タブ [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.
configuration - OSGi宣言型サービスと構成管理者
宣言型サービスの使用法を含むバンドルを作成しています。構成には、DS宣言のプロパティを使用しています。これらの小道具は通常、Config Adminによって変更できますが、永続化されません。コンテナの再起動後、コンポーネントにはデフォルト値があります。
私は次のようにConfigadminを使用しています:
そして私が持っているコンポーネントで:
Felixを使用していますが、プロパティファイルはキャッシュに保存されています
しかし、再起動後はロードされません。私が間違っているのは何ですか?すべてのヒントをありがとう。
osgi - 宣言型サービス アクティベーターで失敗するにはどうすればよいですか?
失敗が回復不能であることがわかっている場合に、宣言型サービスの activate() メソッドで失敗する最善の方法は何ですか? 具体的には、私のサービスは、メタタイプ プロパティを使用して configadmin を介して構成できます。構成が無効な場合 (たとえば、不正な URL など)、失敗するためのベスト プラクティスは何ですか? 私の現在の慣行は、IllegalArgumentException をスローすることです。より良い方法はありますか?DS ホストは例外の種類に注意を払いますか、それともすべての例外が同じように扱われますか?
4.2 の仕様では、「activate メソッドが例外をスローした場合、SCR は Log Service (存在する場合) で例外を含むエラー メッセージをログに記録する必要があり、コンポーネント構成はアクティブ化されません」と単純に述べています。これは、例外をスローするだけでよく、どれが問題ではないことを示唆しています。
他の依存関係のいずれかが変更された場合など、状況によっては DS が activate メソッドを再試行することに気付きました。構成が修正されない限り、インフラストラクチャが気にしないようにするメカニズムはありますか? それとも、それについて心配する必要はなく、アクティベーターが数回追加で呼び出されることを受け入れる必要がありますか?
java - Declarative Services を使用した OSGi+Pax-Web での GWT の問題
プログラムによる Service Tracker の代わりに Declarative Services を使用するために、OSGi (Equinox) および Pax-web で実行されている既存の GWT アプリを移行しています。
Equinox で Pax-Web を使用しています。WAR ベースの GWT アプリケーションは、PAX-WEB War エクステンダーによって問題なくロードされますが、この方法では宣言型サービスを使用できません。
私はすべてのサーブレットを戦争からうまくリファクタリングし、それらを宣言型 OSGi サービスに変換しました ( <provide interface="javax.servlet.Servlet"/>
)。このようにして、サーブレット内の厄介な ServiceTracker コードと特定の OSGi 依存関係をすべて取り除きました。[1]の情報を使用して、フィルターを登録し、静的コンテンツとウェルカム ページを提供するために、他のすべての web.xml 機能をさらに複製しました。
この時点では正常に動作するはずですが、PAX-WEB と GWT がそのリソースをロードしようとする方法に問題があります。
シリアライゼーション記述子のロード中に、GWT はローカル コンテキストからシリアライゼーション ポリシー ファイルをロードします。私の場合、次のようなリソースを解決しようとします: /ctx/ctx/62394587E47773FB1594FF.gwt.rpc このリソースは GWT コンパイラーによって作成され、/war/ctx/ctx/resource... の下に配置されます。
以前は、標準の wab マッピング ( Webapp-Context: /ctx, Webapp-Root: /war
) gwt を使用すると、そのリソースが正しく検出されました。プログラムによるリソース マッピングを使用するようになりました。
GWT はリソースの読み込みに失敗し、次のエラーが発生します。
[注: 最後の文は「結果としてシリアライゼーションの問題が発生することになります」と読む必要があります]
HttpServiceContext がリソースをロードし、パスをプログラム Web コンテキストに関連する URL ではなくファイルとして解釈する問題を追跡しました。
このリソースはバンドル ファイル システムの /war/ctx/ctx/ の下にあるため、これは明らかに失敗します。これはバグ PAXWEB-314 [2] に関連しているようです。この実装では、相対パスをファイル パスに変換します。
この問題を回避する方法はありますか? WAB の代わりに OSGi DS を使用して GWT と PAX-WEB を使用している人はいますか? 考えられる方法の 1 つは、GWT コンパイラによって生成された /war/ctx を /ctx にコピーすることですが、ハックの方向に進む前に適切な解決策を見つけたいと思います。
何か案は?
1 - https://github.com/ops4j/org.ops4j.pax.web/blob/master/samples/whiteboard/src/main/java/org/ops4j/pax/web/extender/samples/whiteboard/internal/ Activator.java [2] - http://team.ops4j.org/browse/PAXWEB-314
osgi - OSGiでの宣言型サービスを使用したサービスファクトリの実装
OSGi宣言型サービスと設定を使用してOSGiサービスを登録しています
servicefactory = "true"
次のように。
別のバンドルからサービスを複数回使用しようとしています。しかし、それは私にサービスの同じインスタンスを返します。
ここで何がうまくいかない可能性がありますか?
osgi - OSGiフラグメントバンドルは宣言型サービスを公開できますか?
セカンドパーティのjarへの追加機能にアクセスするために作成したフラグメントバンドルがあります。私のフラグメントは、この新しい機能を公開するためのサービスを登録する必要があります。うまくいかないようです。トラブルシューティングに入る前に、これが許可されているかどうかを知りたいですか?つまり、Felix SCRのバンドルウォッチャーはフラグメントを確認または無視しますか?
java - Service.FindHook イベントは、コンポーネントへのサービス参照の追加によって呼び出されませんでした
FindHook
今日、私は OSGi フック、特にサービスとサービスのために少し作業しましたEventListenerHook
。プロキシサービスを試してみたかった。正常に動作し、私のEventListenerHook
サービスはプロキシされています。しかし、関連するメソッドに(Bnd スタイル)FindHook
のアノテーションを付けて、サービスがサービス実装の参照を取得すると、イベントが呼び出されないことに気付きました。アノテーションの問題ではなく、DS 全般の問題かもしれません。setXXX
@Reference
これは非常に悪いことです。bc には、プロキシなしとプロキシ付きの 2 つのサービスが登録されています。プロキシされたものからのみ参照を取得したい。一般に、DS を使用しない場合、呼び出すことで参照を取得できBundleContext.getServiceReference(java.lang.Class<S> clazz)
、イベントFindHook.find
が呼び出されます。ここで、どちらServiceReference
を返すかを決定できます。
DS のようなアプローチを使用すると、どのようなプロセスが実行されますか (私にとっては Bnd アノテーション@Reference
)。上記のセクションで説明したように、どのサービスを参照するかを決定したいと考えています。
eclipse - Eclipse P2 - さまざまな P2 コンポーネントを備えた宣言型サービス?
したがって、これを使用してプロビジョニングエージェントからメタデータおよびアーティファクトリポジトリマネージャーを取得しようとすると、この問題が発生します。
それらのサービスがすでに開始されている場合、これは正常に機能します。ただし、サービスがまだ存在しないため、多くの場合、アーティファクト マネージャーは null に戻ります。上記のコードを含むバンドルの開始レベルを 5 に設定することでハックすることができたので、サービス参照を取得する前にすべてのサービスが開始されます。
私は本当に開始レベルを台無しにしたくありません。私がやりたいのは、宣言型サービスを使用してこれらのさまざまなコンポーネントを設定し、サービスの開始を遅らせることです。唯一の問題は、どのサービスを参照すればよいかわからないため、それらを component.xml ファイルに入れることができることです。これはEclipse 3.7.2でも可能ですか?
java - OSGi で ManagedServiceFactory を Decalarative Service として適切に実装するにはどうすればよいですか?
構成ごとに作成する必要があるサービスがあり、それぞれが外部リソースに依存しているため、独自のライフサイクルを管理する必要があります (つまり、サービスを登録 (登録解除) します)。したがって、これらを DS として実装し、SCR が複数のインスタンスを生成できるようにすることはできません。
このタスクを完全に達成するために、ManagedServiceFactory を登録するバンドルを実装できます (私の以前の投稿を参照してください)。しかし結果として、ファクトリが他のいくつかのサービスに依存している場合は、それらのサービスの追跡を開始し、すべてを実行するために多くのグルー コードを記述する必要があります。ManagedServiceFactory
代わりに、SCRがサービス レジストリに登録する (シングルトンの) 宣言型サービスとしてファクトリを実装したいと考えています。
これが私の試みです:
およびサービスの説明:
サービス説明の「factory」プロパティが間違ったパスであることは既にわかりました。この方法では、コンポーネントがManagedServiceFactory
サービス レジストリのように登録されず、代わりにComponentFactory
.
一種のハックとして、コンポーネント プロパティを追加しました。
と追加しましconfiguration-policy="ignore"
た。これは機能します。指定された構成my.project.servicefactory-foobar.cfg
は私のサービスに渡され、サービス レジストリに登録されます。すべて問題ありません。
しかし、私が気に入らないことが2つあります。
- プロパティを手動で設定すること
service.pid
は、私には汚いハックのように感じます - 設定
configuration-policy="ignore"
すると、それ自体を構成できなくなりますManagedServiceFactory
。このプロパティをエスケープするか、require に設定すると、という名前の構成に対して 1 つ取得ManagedServiceFactory
し、patternでmy.project.servicefactory.cfg
名前を付けた構成ごとに 2 つのサービスを取得します。 . (SCRが工場出荷時の設定のプロパティを上書きするため、少なくともこれは指数関数的に増加していません)my.project.servicefactory-foobar.cfg
ManagedServiceFactory
ServiceInterface
ManagedServiceFactory
service.pid
では、これを適切に設定するにはどうすればよいでしょうか。
PS: ファイル名の構成への私の参照について疑問に思っている人のために: 私は構成に Felix Fileinstall を使用するためfoo.cfg
、 PID の ConfigAdmin に配置され、foo
factory -pidにfoo-bar.cfg
配置されます。foo
java - タイプまたはプロパティを使用してOSGi宣言型サービスから選択するのが最善ですか?
私は現在、コードの一部をプレーンJavaコードからOSGi宣言型サービスに変換しています。
元のプレーンJavaコード
クラスは次のように宣言されます。
したがって、すべてのクラスはServiceを実装しますが、Aggregate実装は、必要に応じて子Servicesに延期することができます。
AggregateServiceImpl自体は、他の実装の存在を認識していません。そのコンストラクターは元々次のように宣言されています。
明確化:インターフェース名「サービス」は一般的に意図されており、OSGiDSまたはサービスの概念を表すことを意図していません。
OSGiへの変換
まず、各実装を独自のバンドルに移動します。次に、コンポーネント(サービス実装)を宣言します。私はたまたまbndを使用しているので、サービスアノテーションを使用します。例えば:
クライアントクラスでは、低レベルのOSGi APIを使用してサービスを検索するか、そのバンドル内のDSを使用してオブジェクトを作成できます。
問題
「サービス」を検索する最良の方法は何ですか?AggregateServiceImplが必要ですが、ChildServiceImplの1つを受け取る可能性があります。
別のサービスタイプを使用するか、コンポーネントの1つ(「isRootService」など)にプロパティを追加して、ServiceReferencesを検索するときにフィルターとして使用するのが最善ですか?
java - OSGiでは、初期化例外をどのように適切に処理しますか?
Maven-SCRを使用しています。@Component
andタグを使用する@Service
ことで、クラスインスタンスに自動的に提供されるインターフェイスを登録させることができます。
ただし、場合によっては、activateメソッド(としてマークされている@Activate
)またはコンストラクターでさえ、例外をスローして、処理できない方法で失敗することがあります。
問題は次のとおりです。適切にログに記録できるようにその例外をキャッチしたいのですが、同時に、アクティブ化または初期化に失敗した場合にクラスがサービスを公開しないようにしたいのです。
どうやってこれをするの?
ありがとう!