0

私は特に Java に慣れていないので、私の質問は完全な BS になる可能性がありますが、既存の Java アプリケーションにアップデータ ラッパー (Java アプリ) を作成するという課題に直面しています。私が直面している問題は、新しい jar を開始する必要があるたびに 2 番目と 3 番目の JVM をスピンアップしたくないということですが、ステップ 5) の終了はアップデーターのスレッドによってブロックされます。 Updater.jar の Classloader から起動します。

概念:

  1. アプリの現在のバージョンは、更新を確認するためにトリガーされます
  2. Updater.jar を起動します
  3. OnUpdateAvailable -> 着信接続を閉じ、アプリケーションの状態とそのオブジェクトを保存します
  4. ReadyForUpdate シグナルをソケットのアップデーターに送信します
  5. 現在のアプリケーションは終了します。
  6. アップデータは、アプリケーションの実行可能ファイルとリソースを置き換えます
  7. アップデーターは Application.jar の新しいバージョンを起動し、引数を使用して以前の状態に戻します
  8. アップデーターはアプリケーションを待機します -> 正常に初期化します
  9. アップデーターが終了します
  10. アプリケーションの新しいバージョンが稼働中です

質問: 同じ仮想マシンを使用して、最初にアップデーターを開始し、次にアップデーターからアプリケーションの新しいバージョンを開始する方法はありますか?それとも、別個の JVM を使用する必要がありますか?

Java バージョン: 1.7.0_05-icedtea OpenJDK 64 ビット サーバー VM (ビルド 23.0-b21、混合モード)

4

1 に答える 1

0

別の仮想マシンとラッパー スクリプトを使用してこれを行う方がはるかに簡単だと思います。

System.exitステップ 5 での問題は、シャットダウン フックを呼び出したり実行したりせずにアプリケーションを「シャットダウン」する必要があることです。

  • これには、アプリケーション コード ベースの大幅な再設計が必要になる場合があります。

  • それを行った後でも、古いクラスローダーを使用してロードされたオブジェクトを介して古いアプリケーションの状態が「残る」可能性があるという問題がまだ残っています。それを取り除くのは本当に難しいかもしれません。そうでない場合は、次のようにします。

    • パーマ液漏れがあります。
    • permgen 以外のメモリ リークが発生している可能性があります (たとえば、置き換えられたクラスの静的を介して)。
    • 「再起動された」アプリケーションに問題を引き起こす可能性のあるアプリケーション状態のリークが発生する可能性があります。
于 2013-07-20T01:48:47.807 に答える