1

現在、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 を使用する簡単な方法はありますか?

4

1 に答える 1

3

ええ、あなたは動作する別のものを欠いています。ブリッジとしてjndiを使用してください。aries を使用している場合 (gemini については知りません)、任意の OSGi サービスを jndi ルックアップとして取得することもできます。これを web.xml から取得すれば問題ありません。

たとえば、使用

osgi:service/<interface>[/<filter>]

web.xml からの jndi ソースとしてこれの利点は、現在実行できない #2 の問題 #3 に遭遇しないことです。したがって、基本的にはまだ 3 の選択肢がありますが、#4 を使用することをお勧めします。

于 2012-10-22T20:32:30.957 に答える