2

私は、各アプリケーションが独自の war ファイルにある Java EE 環境で作業しています。各アプリケーション war ファイルの WEB-INF/lib には、すべてのアプリケーションで共有される共通の jar があります。この共通の jar には、コード内の多くのポイントからアクセスされるいくつかのシングルトンが含まれています。war ファイルの境界により、各アプリケーションには独自のシングルトン インスタンスがあります。各アプリケーションでいくつかのシングルトンを異なる方法で構成したいので、これが現在の運用方法です。

現在、OSGi 環境に移行しています。各バンドルには独自のクラス ローダーがあるため、このソリューションは機能しなくなります。そのため、バンドル「common.jar」にある MySingleton にバンドル「appA.jar」またはからアクセスしようとすると、 bundle "appB.jar" 同じインスタンスを取得します。

バンドルごとにシングルトンの異なるインスタンスが「必要」であることを思い出してください。(皮肉に聞こえるかもしれませんが)

理想的な解決策は、これらのシングルトンに依存しないようにコードを修正することだと思いますが、スケジュールが厳しいため、バンドル全体のシングルトンを使用できるようにする何らかの移行ソリューションを提案できるかどうか疑問に思っていました。それらのそれぞれは、バンドルごとに構成できます。

4

3 に答える 3

2

シングルトンは OSGi のサービスになります。

次に、このサービスのさまざまなインスタンスの登録を担当する ManagedServiceFactory (たとえば、この記事を参照)を作成する必要があります。各サービスは異なるプロパティで登録されます (fi application="appA" and application="appB")

その後、適切なプロパティを指定して通常のサービス ルックアップを実行する任意のアプリケーションから適切なサービスにアクセスできます。

于 2009-08-24T17:52:47.277 に答える
1

シングルトンは確かにサービスにマッピングされます。アプリケーション(appA、appB)が実際にバンドルである場合は、サービスをServiceFactoryとして実装します。これにより、呼び出し元のバンドルごとに個別のインスタンスを自動的に返すことができます。これは、ManagedServiceFactory(インスタンスごとに明示的な構成が必要)やハッキングゲッターよりも簡単です。

于 2010-05-11T22:50:12.443 に答える
1

いくつかのオプションを考えることができます:

  1. common.jar のすべてのクラスのコピーを WAR バンドルに直接含めます。
  2. 各 WAR バンドルに common.jar をネストしてから、MANIFEST.MF のバンドル クラス パスを変更して、ネストされた jar を含めます。 Bundle-ClassPath: ., common.jar
  3. OSGi サービスを使用するようにシングルトンを変更し、ServiceFactory を使用して、リクエストしている各バンドルがそのサービスの独自のインスタンスを受け取るようにします。アクセスごとに新しいインスタンスを取得しないようにするには、サービス インスタンスをキャッシュする必要があります (get/use/unget しないでください)。
于 2009-08-23T16:03:27.927 に答える