通过JConsole从MBean关闭/ System.exit上的Java UnmarshalException

时间:2012-09-07 22:42:15

标签: java jmx shutdown unmarshalling jconsole

我想知道当我使用带有JConsole的MBean远程执行关闭调用System.exit(1)时如何避免出现此异常。我已经确认在没有调用shutdown时没有异常,所以其他所有设置都正确。错误是:

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

这当然有道理!我只是不希望这是一个错误的条件。

2 个答案:

答案 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";
 }

答案 1 :(得分:0)

根据您的使用情况,configure your own JMXConnectorServer也可能值得并且从JMX方法停止连接器服务器而不是调用System.exit()。手动配置的连接器服务器正在用户线程中运行,因此当服务器停止运行(并且没有其他用户线程在运行)时,JVM也将终止。

此方法的优点是连接器服务器确保在释放其用户线程之前仍然正常处理所有正在运行的JMX调用。我通过创建一个测试MBean方法验证了这种行为,该方法在连接器服务器上调用stop()并在之后休眠一秒钟,并且在从JMX客户端调用测试方法时总是得到响应。