2012-09-07 43 views
1

我想知道如何避免在使用MBean與JConsole遠程執行關閉時調用System.exit(1)時出現此異常。我已經驗證過,當沒有調用shutdown時,我不會遇到任何異常,因此所有其他設置都是正確的。錯誤是:通過JConsole從MBean關閉/ System.exit導致Java UnmarshalException

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

這當然是有道理的!我只是不希望這是一個錯誤條件。

+0

你是否編組該錯誤? –

回答

4

這是預期的。我假設你的JMX操作是啓動System.exit(1)的?這意味着Jconsole正在等待來自服務器的響應,並且在套接字關閉之前沒有發送任何響應。即使通過JMX調用void方法也會等待確認,以便jconsole可以說「方法成功調用」。由於服務器正在關閉,因此您沒有得到迴應是有道理的。

如果你想避免這種情況,你可以分叉一個線程睡覺一下,然後發出退出。喜歡的東西:

public String jmxShutdown() { 
    new Thread(new Runnable() { 
     public void run() { 
      try { 
       Thread.sleep(100); 
      } catch (InterruptedException e) { 
       // ignored 
      } 
      System.exit(1); 
     } 
    }); 
    return "Shutting down"; 
} 
+0

即使我的方法是無效的? – djechlin

+0

這是正確的@djechlin。即使是一個無效的方法等待確認,所以jconsole可以說「方法成功調用」。 – Gray

0

根據您的使用情況下,它也可能是值得configure your own JMXConnectorServer,並停止從JMX方法,而不是調用System.exit()連接器服務器。手動配置的連接器服務器正在用戶線程中運行,因此,當服務器停止(並且沒有其他用戶線程正在運行)時,JVM也將終止。

此方法的優點是連接器服務器確保所有正在運行的JMX調用在釋放其用戶線程之前仍能正常處理。我通過創建一個在連接器服務器上調用stop()並隨後休眠一秒的測試MBean方法來驗證此行爲,並且在從JMX客戶端調用測試方法時總是收到響應。

+0

我想OP _wants_用'System.exit(...)'關閉應用程序。 – Gray

+0

儘管如此,不同的解決方案可能對其他稍微更一般的問題「如何通過JMX關閉進程並仍然收到JMX響應」有用。我不僅回答OP的這個問題。 – oberlies