1

JConsoleでMBeanを使用して、を呼び出すシャットダウンをリモートで実行するときに、この例外が発生しないようにする方法を考えていますSystem.exit(1)。シャットダウンが呼び出されなくても例外が発生しないことを確認したので、他のすべてが正しく設定されています。エラーは次のとおりです。

Problem invoking shutdown: java.rmi.UnmarshalException: Error unmarshaling return header; nested exception is: java.io.EOFException

これは確かに理にかなっています!これをエラー状態にしたくないだけです。

4

2 に答える 2

4

これは予期されることです。あなたの JMX 操作がSystem.exit(1)?を開始したものだと思います。これは、Jconsole がサーバーからの応答を待っていて、ソケットが閉じられる前に何も送信されなかったことを意味します。JMX を介してメソッドを呼び出す場合でもvoid確認応答を待機するため、jconsole は「メソッドが正常に呼び出されました」と言うことができます。サーバーがシャットダウンしているため、応答がないのは理にかなっています。

これを回避したい場合は、スレッドを fork して少しスリープさせてから exit を発行できます。何かのようなもの:

 public String jmxShutdown() {
     new Thread(new Runnable() {
         public void run() {
             try {
                Thread.sleep(100);
             } catch (InterruptedException e) {
                // ignored
             }
             System.exit(1);
         }
     });
     return "Shutting down";
 }
于 2012-09-07T22:44:29.940 に答える
0

ユース ケースによっては、独自の構成をJMXConnectorServer行い、 を呼び出す代わりに JMX メソッドからコネクタ サーバーを停止することも価値がある場合がありますSystem.exit()。手動で構成されたコネクタ サーバーはユーザー スレッドで実行されているため、サーバーが停止すると (他のユーザー スレッドが実行されていない場合)、JVM も終了します。

このアプローチの利点は、コネクタ サーバーが、ユーザー スレッドを解放する前に、実行中のすべての JMX 呼び出しが引き続き正常に処理されることを保証することです。stop()コネクタ サーバーで呼び出し、その後 1 秒間スリープするテスト MBean メソッドを作成して、この動作を確認しました。JMX クライアントからテスト メソッドを呼び出すと、常に応答が返されました。

于 2014-04-24T15:56:40.587 に答える