gpt4 book ai didi

java - 未收到嵌入式 Jetty 应用程序的 JMX 通知

转载 作者:行者123 更新时间:2023-12-02 13:30:58 27 4
gpt4 key购买 nike

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

我按如下方式配置 JMX,其中服务器是 jetty 服务器:

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 更改为嵌入式 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

使用上述命令运行应用程序解决了问题。

关于java - 未收到嵌入式 Jetty 应用程序的 JMX 通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43182044/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com