バンドルが完全にロードされてリクエストに使用できるかどうかを検出するためのBundleEventクラスのようなイベントリスナーはありますか?
私は検索をしました、そして私が見つけることができたのはこれだけです
これはイベントリスナーを使用せず、手動または定期的にチェックする必要があることを意味します(ちなみにそのコードはテストしていません。
ロード操作のBundleEvent.STARTINGのようなイベントはありますか?または、(可能であれば)自分で実装する必要がありますか?
BJが述べたように、1つのオプションはOSGiサービスを使用することです。たとえば、バンドルBはサービスが表示されるのを待ちます。バンドルAの準備ができると(たとえば、アクティベーションが終了すると)、サービスが登録されます。これにより、バンドルBに通知ServiceTracker
されます。そのためにを使用できます。
別のオプションは、を使用することBundleTracker
です。バンドルBのアクティベーターで、バンドルの状態についてBundleTracker
通知を受けるaを登録できます。STARTED
ただし、バンドルがなくなる時期を発見できるように、他の状態も監視する必要があります。
OSGiには、2種類の依存関係があります。最初の種類は、基本的に、バンドルを安全に実行できる環境をセットアップすることです。これには、マニフェストで表現できるコードの依存関係やその他の依存関係が含まれます。フレームワークは、バンドルを解決する前に、これらの依存関係が満たされていることを確認します。これらの依存関係が満たされない場合、単一の命令を実行することはできません。
2番目の種類の依存関係はより動的であり、コードはそれらが変更されたときに実行時にそれらを処理できる必要があります。OSGiでは、これらの依存関係は最もよく表現されたサービスです。宣言型サービス(特にアノテーション付き)では、他の人に依存するのは簡単です(これには、サービストラッカーを使用しないでください。DSははるかに優れています)。
したがって、他の回答者が言ったように、準備は見る人の目にあります。OSGiでは、サービスへの依存関係を表現すると、問題はバンドルの準備ができている状態から次のようにシフトします。サービスXはありますか?サービスXのレジストラがこれらのルールに従っている限り、非常に堅牢で復元力のあるアプリケーションモデルがあります。フレームワークとDSはライフサイクルルールに厳密に従っているため、バンドルの準備ができているか、単一のモデルであるサービスで崩壊しない理由はさまざまです。
簡単な例として、サービスYはサービスXに依存しています。
@Component
public class YImpl implements Y {
@Activate
void activate() { /* only called when X is registered */ }
@Reference
void setX( X x ) {
this.x = x;
}
}
OSGiフレームワークが、バンドルがビジネスの「準備ができている」ことを知る方法はありません。もちろん、フレームワークは、クラスをロードできるようにするために、バンドルのコード依存関係が解決されていることを確認できます。ただし、他の依存関係はフレームワークでは認識できません。いつビジネスの準備ができたかを知ることができるのは、バンドルだけです。これを示すサービスを登録することで、これを宣伝することができます。