Не получают уведомления JMX для встроенного приложения Jetty

У меня есть встроенное приложение Jetty, работающее локально, и к нему подключена jconsole. Когда я подписываюсь на уведомления от java.lang.Memory, я не вижу никаких уведомлений, даже когда я запускаю сборку мусора вручную. Я новичок в JMX, но понимаю, что mbeans платформы, такие как GarbageCollectorMXBean и MemoryMXBean, должны быть доступны по умолчанию и не нуждаются в настройке. Это правильно?

Я настраиваю JMX следующим образом, где server - это сервер пристани:

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 я смогу просто выбрать mbean на вкладке MBeans и нажать «подписаться», чтобы увидеть его уведомления?

Спасибо за вашу помощь.

РЕДАКТИРОВАТЬ: просто попытался добавить следующие аргументы при вызове 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 \

person RJinman    schedule 03.04.2017    source источник


Ответы (1)


Оказывается, я получал уведомления 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

Запуск приложения с указанным выше способом решил проблему.

person RJinman    schedule 03.04.2017
comment
Все это похоже на параметры настройки GC, они не должны влиять на JMX MBeans. - person Joakim Erdfelt; 03.04.2017
comment
Конечно, они будут, поскольку создаются разные сборщики мусора. Если я подключусь через jconsole и посмотрю на вкладку MBeans, там будут разные MBeans. - person RJinman; 04.04.2017
comment
В этом списке параметров я не вижу другого объявленного сборщика мусора, вы просто настраиваете существующий сборщик мусора. - person Joakim Erdfelt; 04.04.2017
comment
Когда я подключаюсь к приложению с помощью jconsole, я вижу разные MBeans, когда использую эти параметры. - person RJinman; 05.04.2017