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 正在等待来自服务器的响应,并且在套接字关闭之前没有发送任何响应。即使void通过 JMX 调用方法也会等待确认,因此 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";
 }
于 2012-09-07T22:44:29.940 回答
0

根据您的用例,配置您自己的JMXConnectorServer并从 JMX 方法停止连接器服务器而不是调用System.exit(). 手动配置的连接器服务器正在用户线程中运行,因此当服务器停止时(并且没有其他用户线程在运行),JVM 也会终止。

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

于 2014-04-24T15:56:40.587 回答