允许在启用 JMX 监视的情况下重新启动 Java 应用程序

2022-09-04 22:44:20

我有一个启用了JMX监控的Java应用程序,如下所示:

-Dcom.sun.management.jmxremote.port=9999 \
// some other properties omitted

但是当我尝试重新启动应用程序时,有时我收到一个错误,说JMX端口号已经在使用中。这是不可接受的。

因此,我想将底层套接字的SO_REUSEADDR设置为 true 以避免此错误,但未发现相关的 JMX 属性。

有什么想法吗?


答案 1

恐怕你不能从命令行做到这一点。

您需要创建一个 ,它使用所需的选项 () 生成。RMIServerSocketFactoryServerSocketsSO_REUSEADDR

此处的文档: http://docs.oracle.com/javase/8/docs/technotes/guides/rmi/socketfactory/

其他人解决同样的问题:https://svn.apache.org/viewvc?view=revision&revision=r1596579


答案 2

我有同样的问题。这是我的应用程序(我已停止)的第一个实例,它仍订阅了此端口,因此新实例无法启动。在我的情况下,它与套接字TIME_WAIT机制无关,而是与以下事实有关:调用后,所有正在运行的线程都花了一些时间才正常结束。在我的情况下,有效的方法是在停止应用程序之前注销Bean,以便套接字可用。stop()

private void unregisterBeanForName(String name) {
        try {

            JMXServiceURL jmxServiceURL = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://127.0.0.1:9999/jmxrmi");
            JMXConnector cc = JMXConnectorFactory.connect(jmxServiceURL);
            MBeanServerConnection mbsc = cc.getMBeanServerConnection();
//This information is available in jconsole
            ObjectName serviceConfigName = new ObjectName("YourObjectName");
            mbsc.unregisterMBean(serviceConfigName);
// Close JMX connector
            cc.close();
        } catch (Exception e) {
            System.out.println("Exception occurred: " + e.toString());
            e.printStackTrace();
        }
    }

推荐