4

外部モジュールを利用するサーバー アプリケーションを作成しています。サーバーの再起動を必要とせずにアップグレードできるようにしたいと思います。それ、どうやったら出来るの?OSGiを見つけましたが、私のタスクには非常に複雑で大きく見えます。

単純な *.jar ファイルは問題ありませんが、いったんロードされると、VM からアンロードしてその場で別のバージョンに置き換えることはできないと思います。

どのようなアプローチを提案できますか?

4

5 に答える 5

4

OSGi はまさにあなたが求めているもののようです。複雑かもしれませんが、それに対処する方法があります。複雑さの一部は、SpringDM などを使用してランタイムでサービスを登録および使用するボイラープレート タスクを処理することで軽減できます。アノテーション主導のサービス登録と依存性注入により、記述する必要のあるコードの量が大幅に削減されます。

複雑さを軽減するもう 1 つの方法は、アプリケーションの大部分を 1 つのバンドルにデプロイし、モジュール化する必要がある部分のみを独自のバンドルにデプロイすることです。これにより、ランタイムで他のバンドルのサービスを登録して使用する機会が減り、デプロイの複雑さが軽減されます。バンドル内で実行されるコードは、標準の Java アプリと同様に、同じバンドル内の他のコードを使用できます。OSGi ランタイムと対話する必要はありません。このアプローチの反対は、システム内の他のバンドルに明確に定義されたサービスをエクスポートする多数の個別のバンドルにアプリケーションを分割することです。これは非常にモジュール化されたアプローチですが、これらすべてのバンドルを管理する複雑さが増し、OSGi ランタイムとのやり取りが増えます。

「OSGi in Action」という本を読んで問題を把握し、適切なサンプルを確認することをお勧めします。

于 2011-04-06T15:41:52.877 に答える
2

少なくともカスタムクラスローダーを定義する必要があります... Felix、Equinox、Knoplerfish、またはオープンソースの Osgi ランタイムを使用してタスクを実行するよりも、これがどのように簡単になるかわかりません。多分SpringDMの方が簡単です...

于 2011-03-30T13:27:40.527 に答える
1

あなたがしようとしていることは間違いなく可能です。クラスを別のClassLoaderにロードしてから、そのClassLoaderを破棄することで、クラスをメモリからアンロードできると思います。外出してOSGIを使用したくない場合は、JBoss Microcontainer(http://www.jboss.org/jbossmc)やClassWorlds(http://classworlds.codehaus.org/)のようなものをお勧めします。あなたのニーズが十分に専門化されていれば、このようなものを最初から書くことはそれほど難しくありません。

これがお役に立てば幸い、ネイト

于 2011-03-30T13:34:57.013 に答える
1

ルートに従う場合ClassLoader(実際にはそれほど難しくありません)、各モジュールを独自の jar にパッケージ化し、異なる ClassLoader を使用して各 jar を読み取ることをお勧めします。そうすれば、モジュールをアンロードすることは ClassLoader を「破棄する」ことと同じです。

于 2011-03-30T14:57:30.680 に答える
0

OSGiはそれほど複雑ではありません-MavenでPAXランナーを使用するのは簡単です。

または、独自のClassLoaderを実装して、JVMに設定します。java-Djava.system.class.loader = com.test.YourClassLoader App.class

于 2011-03-30T13:35:32.143 に答える