現在、Pax Web を使用して OSGi Web アプリケーション バンドルを展開しています。この Web バンドルから、一連の OSGi サービスにアクセスする必要があります。システムの残りの部分では、サービスの作成と利用に Blueprint を使用しています。これは、プロキシ、ダンピングなどを提供するため、優れています。
Pax Web でデプロイされた Web アプリケーション バンドルから、これらの OSGi サービスにアクセスする最良の方法は何ですか?
私の考えは
1) osgi-bundlecontext 属性を介して ServletContext から BundleContext を取得し、OSGi ServiceTracker クラスを使用します。
2) 必要なサービスへの参照を含むブループリント コンテキスト ファイルを Web バンドルに作成します。Blueprint コンテキストは、Blueprint エクステンダーによって OSGi サービス レジストリに登録され、そこから取得して ID で Bean を検索できます。
3) Springs ContextLoaderListener などを使用して、web.xml ファイルにブループリント コンテキストを作成します。
オプション 1 は問題ありませんが、サービスを追跡する必要があり、Blueprint のメリットをまったく享受できません。
オプション 2 も問題なく動作しますが、タイミングの問題があります。実際には、アプリケーションをデプロイする 2 つのサービスがあります。web.xml ファイルを使用してデプロイする Pax Web エクステンダーと、Blueprint コンテキスト ファイルをデプロイする (私の場合は Gemini) Blueprint エクステンダーです。起動時にこれらのエクステンダーは同時にデプロイされ、Pax Web エクステンダーがサーブレット コンテキスト リスナーをインスタンス化するときに、アプリケーション コンテキストが OSGi サービス レジストリで使用できるという保証はありません。これは、OSGi サービスをコンテキスト リスナー コードから呼び出すことができないことを意味します。
オプション 3 - これが可能かどうかはよくわかりません。Spring DM がこのアプローチを使用していたように見えますか?
私は何かが欠けているに違いないと感じています - Pax Web でデプロイされた Web バンドル内から Blueprint を使用する簡単な方法はありますか?