在为JMX远程管理设置JVM属性时遇到问题

时间:2013-12-29 08:05:53

标签: java jmx jvm-arguments

导出JMX代理进行远程管理时,将以下参数设置为VM参数

  

-Dcom.sun.management.jmxremote =真               -Dcom.sun.management.jmxremote.authenticate = FALSE               -Dcom.sun.management.jmxremote.port = 9999               -Dcom.sun.management.jmxremote.ssl =假

它工作正常,因为我的JMX客户端能够轻松地在端口9999与MBean建立连接。

现在,我想通过配置文件在运行时设置这些属性。 我尝试通过System.setProperty("com.sun.management.jmxremote.port","9999");和其他属性设置它,但无济于事。 JMX代理不会以这种方式暴露给远程管理。

我甚至尝试在端口9999上创建一个注册表,但似乎还不够。

private void init() {
    try {
        LocateRegistry.createRegistry(9999);
        System.setProperty("com.sun.management.jmxremote", "true");
        System.setProperty("com.sun.management.jmxremote.authenticate", "false");
        System.setProperty("com.sun.management.jmxremote.port", "9999");
        System.setProperty("com.sun.management.jmxremote.ssl", "false");
    } catch (RemoteException e) {
        e.printStackTrace();
    }
}

我只是不明白为什么通过VM参数设置这些属性有效,而不是像我上面所描述的那样以编程方式设置相同的属性。

3 个答案:

答案 0 :(得分:1)

这对我有用。我假设你已经知道如何在下面的例子中使用SimpleMXBean。

参考Oracle JMX Tutorial。 (参见使用JMX Remote API模拟开箱即用的管理部分。)

package sample;

import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.rmi.registry.LocateRegistry;
import java.util.HashMap;
import java.util.Map;

import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;

public class MBServerTest {
    public static void loadJMXAgent(int port, MBeanServer mbs) throws IOException  {
        LocateRegistry.createRegistry(port);
        System.out.println("Initialize the environment map");
        Map<String,Object> env = new HashMap<String,Object>();
        env.put("com.sun.management.jmxremote.authenticate", "false");
        env.put("com.sun.management.jmxremote.ssl", "false");
        System.out.println("Create an RMI connector server");
        JMXServiceURL url =
            new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:"+port+"/jmxrmi");
        JMXConnectorServer cs =
            JMXConnectorServerFactory.newJMXConnectorServer(url, env, mbs);

        // Start the RMI connector server.
        //
        System.out.println("Start the RMI connector server");
        cs.start();

    }

    public static void main(String[] args) throws Exception {
        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
        loadJMXAgent(1199,mbs);

        SimpleStandard cache = new SimpleStandard();

        ObjectName name = new ObjectName(
                "org.javalobby.tnt.jmx:type=ApplicationCacheMBean");
        mbs.registerMBean(cache, name);
        imitateActivity(cache);
    }

    private static void imitateActivity(SimpleStandard cache) {
        while (true) {
            try {
                cache.cacheObject("hello");
                Thread.sleep(1000);
            } catch (InterruptedException e) {
            }
        }
    }
}

答案 1 :(得分:0)

仅提供属性可能不会触发在您提供的端口上创建RMI连接器。如果要在运行时启用远程监视,那么我认为您还必须自己在MBean服务器上创建连接器。

查看Oracle JMX tutorial的“模仿开箱即用管理”一章。特别是示例代码的最后一位,它使用端口3000作为RMI服务器。这是您想要放置所选端口的地方:

LocateRegistry.createRegistry(3000); 
Map<String,Object> env = new HashMap<String,Object>();
env.put("com.sun.management.jmxremote.authenticate", "false");
env.put("com.sun.management.jmxremote.ssl", "false");
// Create an RMI connector server.
//
// specified in the JMXServiceURL the RMIServer stub will be
// registered in the RMI registry running in the local host on
// port 3000 with the name "jmxrmi". This is the same name the
// out-of-the-box management agent uses to register the RMIServer
// stub too.
//
System.out.println("Create an RMI connector server");
JMXServiceURL url =
    new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:3000/jmxrmi");
JMXConnectorServer cs =
    JMXConnectorServerFactory.newJMXConnectorServer(url, env, mbs);

// Start the RMI connector server.
//
System.out.println("Start the RMI connector server");
cs.start();

答案 2 :(得分:0)

从应用程序设置系统属性有点太晚了。 JMX代理已加载并初始化。

您可以使用JMX configuration file将属性存储在一个外部文件中。虽然它不允许您从一个共享配置文件中读取属性,但它启用了您至少将设置外部化为不同的用户属性文件。