未接收嵌入式 Jetty 应用程序的 JMX 通知



我有一个嵌入式的Jetty应用程序在本地运行,并连接了jconsole。当我订阅来自java.lang.Memory的通知时,我看不到任何通知 - 即使我手动触发垃圾回收也是如此。我是JMX的新手,但我的理解是像GarbageCollectorMXBean和MemoryMXBean这样的平台mbeans应该默认可用,不需要配置。这是对的吗?

我正在按如下方式配置 JMX,其中服务器是码头服务器:

private void configureJmx(CommandLine cmd) {
    String jmxRmiHost = cmd.getOptionValue("jmxRmiHost");
    String jmxRmiPortString = cmd.getOptionValue("jmxRmiPort");
    String jmxPasswordFile = cmd.getOptionValue("jmxPasswordFile");
    String jmxAccessFile = cmd.getOptionValue("jmxAccessFile");
    if (jmxRmiHost != null || jmxRmiPortString != null || jmxPasswordFile != null || jmxAccessFile != null) {
        if (jmxRmiHost == null || jmxRmiPortString == null || jmxPasswordFile == null || jmxAccessFile == null) {
            throw new IllegalStateException("If any of -jmxRmiHost, -jmxRmiPort, -jmxPasswordFile or -jmxAccessFile "
                    + "are set, then all of them must be");
        } else {
            int jmxRmiPort = Integer.valueOf(jmxRmiPortString);
            MBeanContainer mbContainer = new MBeanContainer(ManagementFactory.getPlatformMBeanServer());
            server.addEventListener(mbContainer);
            server.addBean(mbContainer);
            server.addBean(Log.getLog());
            String rmiUrl = "/jndi/rmi://" + jmxRmiHost + ":" + jmxRmiPort + "/jmxrmi";
            try {
                JMXServiceURL jmxServiceUrl = new JMXServiceURL("rmi", jmxRmiHost, jmxRmiPort, rmiUrl);
                Map<String, String> jmxEnvironment = new HashMap<String, String>(2);
                jmxEnvironment.put("jmx.remote.x.password.file", jmxPasswordFile);
                jmxEnvironment.put("jmx.remote.x.access.file", jmxAccessFile);
                String name = "org.eclipse.jetty.jmx:name=rmiconnectorserver";
                ConnectorServer connectorServer = new ConnectorServer(jmxServiceUrl, jmxEnvironment, name);
                connectorServer.start();
            } catch (Exception e) {
                throw new RuntimeException("Unable to configure JMX: " + e);
            }
        }
    }
}

大概在 jconsole 中,我应该能够在 MBeans 选项卡中选择 mbean,然后单击"订阅"以查看其通知?

感谢您的帮助。

编辑:刚刚尝试在调用java时添加以下参数。还是没有运气。

  -Dcom.sun.management.jmxremote 
  -Dcom.sun.management.jmxremote.port=9010 
  -Dcom.sun.management.jmxremote.local.only=false 
  -Dcom.sun.management.jmxremote.authenticate=false 
  -Dcom.sun.management.jmxremote.ssl=false 

事实证明,我收到了JMX通知,但我期望的MBean不存在。这是因为当我们从独立更改为嵌入式 Jetty 时,我们忘记使用相同的参数调用 java。我检查了 Jetty 的配置文件,发现它使用以下命令行参数。

-XX:+UseConcMarkSweepGC
-XX:ParallelCMSThreads=2
-XX:+CMSClassUnloadingEnabled
-XX:+UseCMSCompactAtFullCollection
-XX:CMSInitiatingOccupancyFraction=80
-XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails
-XX:+PrintTenuringDistribution
-XX:+PrintCommandLineFlags
-XX:+DisableExplicitGC

使用上述方法运行应用程序解决了问题。

最新更新