3

Felix構成管理ライブラリを使用して、OSGiサービスの構成ファイルを読み取って適用しています。私が構成しているサービスの多くはサードパーティ(org.ops4j.pax.web.pax-web-jettyorg.ops4j.pax.url.mvnなどBundleActivator)であり、宣言型サービスではなく単純なサービスを使用しています。これらのサービスはそれぞれ2回初期化されることがわかりました。

  1. アクティベーション時に、彼らは呼び出しますManagedService#updated(null)、そして
  2. 非常に短い間、Felixは非同期ConfigurationManager.UpdateThreadで呼び出します。ManagedService#update(non-null)

構成を適用するためのこの遅延は嫌いです。固有の競合状態が原因で、不規則な障害が発生します。この問題を回避するために構成を同期的に適用できる代替のCM実装はありますか?または、Felixを同期させることはできますか?(ソースコードとManagedService javadocを調べると、いいえのように見えます。)

4

1 に答える 1

4

実際にはupdate()、別のスレッドからのコールバックはConfigAdmin仕様の要件です。R4大要仕様のセクション104.5.3を参照してください。

Configuration AdminサービスからManagedServiceへのupdated(Dictionary)コールバックは、非同期で実行する必要があります。この要件により、マネージドサービスは、構成管理サービスのコールバックからの干渉を受けることなく、同期された方法で初期化を完了することができます。

残念ながら、これは、不規則な障害や固有の競合状態が発生しないように、ManagedServiceをコーディングする必要があることを意味します。たとえば、以外の別のインターフェースでサービスとして登録する場合は、 null以外が受信されるManagedServiceまで待ってから、そのインターフェースで登録してください。update

于 2011-10-01T00:26:33.483 に答える