1

複数のスレッドが実行されているアプリケーションがあります。それらのそれぞれは、何か予期しないことが起こった場合に使用できる cat(Throwable ) でラップされています。Ubuntu/Linux でアプリ自体を再起動する最善の方法は何ですか。このプロジェクト「Java Service Wrapper」を見つけましたが、それに関する経験はありますか?

-XX:OnError オプションを試しましたが、うまくいかないようです (Java(TM) SE Runtime Environment (build 1.6.0_16-b01) )

4

2 に答える 2

4

バッチ ファイル (ループする) から起動して、System.exit(1) を使用できますか?

その場合は、バッチ ファイルでエラー レベルをテストし、1 の場合はループ バックしてプログラムを再起動しますが、0 の場合はバッチ ファイルを終了します。

編集:外部から「リセット」をトリガーしますか(unixから?)

もしそうなら、私の提案は次のようになります。

  1. -restart というコマンドライン オプションを作成します。
  2. コマンド ラインなしで実行する場合は、事前に設定された高いポート (32123?) でソケットを開き、アプリの起動の一部として接続をリッスンします。
  3. キー文字列が渡された接続を取得したら、System.exit(1); を実行します。
  4. -restart で実行すると、通常の起動の代わりにそのポートに接続し、正しいキー文字列を送信して終了します。
  5. 再起動ルーチンが接続できない場合は、デーモンが実行されていないことを示すエラー メッセージを出力してください。

メッセージを既存のプロセスに送信する方法は他にもありますが、おそらくソケットを使用するのが最も簡単です。数行のコードしかありません。もう 1 つは、ある絶対的な場所にファイルが存在するかどうかをポーリングすることです。また、PID を見つけて強制終了することもあります。

プラットフォームに依存しないという追加の利点としてのソケット。

于 2009-12-22T18:04:08.000 に答える
0

多くのスレッドを処理するメカニズムを設計し、問題を検出して、失敗したスレッドを Java 内から再開できるかどうかを判断する必要があります。

オペレーティング システムが問題になるのは、アプリケーションが完全に終了し、再起動が必要な場合のみです。アプリケーションの一部が実行されている限り、これを考慮する必要はありません。

于 2009-12-23T08:09:35.747 に答える