将Java Mission Control连接到Wildfly 16

7

我尝试连接Java Mission Control (JMC)和Wildfly 16,应用服务器位于Docker上。

我成功通过jconsole连接到wildfly,按照这里描述的步骤进行管理。

不幸的是,我无法通过JMC连接。我使用的URL看起来像这样:

service:jmx:remoting-jmx://192.168.99.100:9990

  • 我试图将Xbootclasspath设置为jboss-cli-client.jar,就像这里描述的那样,但我只得到了“无法连接”的错误。
  • 我设置了与jconsole使用的相同的jar包,但仍然得到了“无法连接”的错误。
  • 我尝试在容器站点上添加标志,就像这里所示,但是使用这些标志,甚至wildfly都没有启动。

然后,我发现了这里通过硬编码一些jboss类以启用通过远程-jmx进行连接的想法。根据wildfly16提供的这些信息,我更改了jar的版本,并将其放入了jmc.ini中,如下所示。

-Xbootclasspath/a:"C:/Program Files/Java/jdk-10.0.2/lib/missioncontrol/dropins/jboss-cli-client.jar;C:/wildfly-16.0.0.Final/modules/system/layers/base/org/jboss/remoting-jmx/main/remoting-jmx-3.0.1.Final.jar;C:/wildfly-16.0.0.Final/modules/system/layers/base/org/jboss/remoting/main/jboss-remoting-5.0.8.Final.jar;C:/wildfly-16.0.0.Final/modules/system/layers/base/org/jboss/logging/main/jboss-logging-3.3.2.Final.jar;C:/wildfly-16.0.0.Final/modules/system/layers/base/org/jboss/xnio/main/xnio-api-3.6.5.Final.jar;C:/wildfly-16.0.0.Final/modules/system/layers/base/org/jboss/xnio/nio/main/xnio-nio-3.6.5.Final.jar;C:/wildfly-16.0.0.Final/modules/system/layers/base/org/jboss/marshalling/main/jboss-marshalling-2.0.6.Final.jar;C:/wildfly-16.0.0.Final/modules/system/layers/base/org/jboss/marshalling/river/main/jboss-marshalling-river-2.0.6.Final.jar;C:/wildfly-16.0.0.Final/modules/system/layers/base/org/jboss/as/cli/main/wildfly-cli-8.0.0.Final.jar;C:/wildfly-16.0.0.Final/modules/system/layers/base/org/jboss/staxmapper/main/staxmapper-1.3.0.Final;C:/wildfly-16.0.0.Final/modules/system/layers/base/org/jboss/as/protocol/main/wildfly-protocol-8.0.0.Final.jar;C:/wildfly-16.0.0.Final/modules/system/layers/base/org/jboss/dmr/main/jboss-dmr-1.5.0.Final.jar;C:/wildfly-16.0.0.Final/modules/system/layers/base/org/jboss/as/controller-client/main/wildfly-controller-client-8.0.0.Final.jar;C:/wildfly-16.0.0.Final/modules/system/layers/base/org/jboss/threads/main/jboss-threads-2.3.3.Final.jar;C:/wildfly-16.0.0.Final/modules/system/layers/base/org/jboss/logmanager/main/jboss-logmanager-2.1.7.Final.jar"

之后,最终,我又遇到了另一个错误,即

无法初始化类org.jboss.remotingjmx.RemotingConnector

我已经将remoting-jmx-3.0.1.Final的依赖项添加到Xbootclasspath中,但我仍然得到相同的错误。

我的问题是,你有任何想法如何使这个连接工作吗?也许有人用不同的方式做过?

任何关于如何调试这个问题的建议都将是无价之宝,因为我缺乏解决它的思路。


我通常会复制jconsole脚本,然后更新为jmc。正如您所发现的那样,设置类路径的参数是不同的,但使用的jar包是相同的。 - Will Tatam
@WillT 你有任何例子吗? - MyWay
“jmc -cp…”不起作用。这些链接中有哪个能帮助到您吗?- https://community.oracle.com/thread/2592885?tstart=0 - http://sattish-performanceengg.blogspot.com/2016/01/configure-java-mission-control-for.html - https://gautric.github.io/blog/2016/07/19/JConsole-JavaMissionControl-JBoss-EAP-7.html - https://access.redhat.com/solutions/700283 - Klara
@Klara,终于我成功建立了这个连接。我使用了JDK 8中的jmc来完成它,因为所有的教程都是针对这个较旧的jmc。我找不到任何适用于更高版本的方法 :( - MyWay
@MyWay 你使用的是哪个 JMC 版本/构建版本?我猜这是在 Windows 上? - Klara
@Klara JMC 6来自jdk 1.8.0_121。是的,我在Windows上完成了它。我在这里描述了(https://github.com/ThisIsMyWay/BookShopProject),我如何连接它。 - MyWay
2个回答

6
  1. 在 %WILDFLY_HOME%\bin\standalone.conf.bat 中添加:

    set "JAVA_OPTS=%JAVA_OPTS% -XX:+FlightRecorder"

  2. 在 jmc.ini 文件的 -vmargs 下面添加:

    -Xbootclasspath/a:C:\%wildfly_home%\bin\client\jboss-cli-client.jar

(%wildfly_home% 是不同的路径,或者将 jboss-cli-client.jar 复制到其他目录并更正路径) 3. 运行 JMC,创建新连接,在 Connection Properties 面板中点击“Custom JMX service URL”按钮,输入以下内容:

service:jmx:http-remoting-jmx://localhost:9990    

在凭据字段中,只需输入用户名和密码,它们应该是为域管理创建的(例如使用 %wildfly_home%\bin\add-user.bat)希望这可以帮助到某些人。

谢谢,它对我帮助很大。当然,强调重启 JMC 没有必要,但我忘了它,浪费了更多的时间。 - Halis Yılboğa
谢谢,我还添加了-XX:+ UnlockCommercialFeatures以及-XX:+ FlightRecorder - Wafa
1
运行良好。但仅适用于Java 8。Java 11失败。 - Juan Ignacio Barisich

1

对我来说,解决方案在Java 11上不起作用。任务控制在连接到Wildfly时出现错误:

Caused by: java.lang.NoClassDefFoundError: org/ietf/jgss/GSSManager
at java.base/java.lang.Class.getDeclaredConstructors0(Native Method)
at java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:3137)
at java.base/java.lang.Class.getConstructor0(Class.java:3342)
at java.base/java.lang.Class.getConstructor(Class.java:2151)
at java.base/java.security.Provider.newInstanceUtil(Provider.java:152)
at java.base/java.security.Provider$Service.newInstance(Provider.java:1824)
at org.wildfly.security.WildFlyElytronBaseProvider$ProviderService.newInstance(WildFlyElytronBaseProvider.java:218)
at org.wildfly.security.sasl.util.SecurityProviderSaslClientFactory.createSaslClient(SecurityProviderSaslClientFactory.java:94)
at org.wildfly.security.sasl.util.AbstractDelegatingSaslClientFactory.createSaslClient(AbstractDelegatingSaslClientFactory.java:66)
at org.wildfly.security.sasl.util.ProtocolSaslClientFactory.createSaslClient(ProtocolSaslClientFactory.java:50)
at org.wildfly.security.sasl.util.AbstractDelegatingSaslClientFactory.createSaslClient(AbstractDelegatingSaslClientFactory.java:66)
at org.wildfly.security.sasl.util.ServerNameSaslClientFactory.createSaslClient(ServerNameSaslClientFactory.java:50)
at org.wildfly.security.sasl.util.AbstractDelegatingSaslClientFactory.createSaslClient(AbstractDelegatingSaslClientFactory.java:66)
at org.wildfly.security.sasl.util.ServerNameSaslClientFactory.createSaslClient(ServerNameSaslClientFactory.java:50)
at org.wildfly.security.sasl.util.FilterMechanismSaslClientFactory.createSaslClient(FilterMechanismSaslClientFactory.java:102)
at org.wildfly.security.sasl.util.AbstractDelegatingSaslClientFactory.createSaslClient(AbstractDelegatingSaslClientFactory.java:66)
at org.wildfly.security.sasl.util.LocalPrincipalSaslClientFactory.createSaslClient(LocalPrincipalSaslClientFactory.java:76)
at org.wildfly.security.sasl.util.PrivilegedSaslClientFactory.lambda$createSaslClient$0(PrivilegedSaslClientFactory.java:64)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at org.wildfly.security.sasl.util.PrivilegedSaslClientFactory.createSaslClient(PrivilegedSaslClientFactory.java:64)
at org.wildfly.security.auth.client.AuthenticationConfiguration.createSaslClient(AuthenticationConfiguration.java:1545)
at org.wildfly.security.auth.client.AuthenticationContextConfigurationClient.createSaslClient(AuthenticationContextConfigurationClient.java:430)
at org.jboss.remoting3.remote.ClientConnectionOpenListener$Capabilities.handleEvent(ClientConnectionOpenListener.java:419)
at org.jboss.remoting3.remote.ClientConnectionOpenListener$Capabilities.handleEvent(ClientConnectionOpenListener.java:244)
at org.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:92)
at org.xnio.conduits.ReadReadyHandler$ChannelListenerHandler.readReady(ReadReadyHandler.java:66)
at org.xnio.nio.NioSocketConduit.handleReady(NioSocketConduit.java:89)
at org.xnio.nio.WorkerThread.run(WorkerThread.java:591)

此外,嵌入到JDK 8中的jmc无法为Java 11进程启动飞行记录。因此,在调查后,我发现这个类是由引导类加载器加载的。根据https://openjdk.java.net/jeps/261,jdk.security.jgss模块未定义为引导类加载器。但是,来自wildfly-elytron项目的jboss-cli-client.jar中的类在运行时需要jgss类。因此,我找到了这个问题的一个不太正式的解决方法:在jmc.ini中使用来自jre 8的引导所需的类。Linux的完整选项为:
-vmargs -Xbootclasspath/a:<path_to_wildfly>/jboss-cli-client.jar:<path_to_jdk8>/jre/lib/rt.jar

而对于Windows:

-vmargs -Xbootclasspath/a:<path_to_wildfly>\jboss-cli-client.jar;<path_to_jdk8>\jre\lib\rt.jar

在此之后,使用运行于11 JDK上的jmc可以成功连接运行于11 JDK上的wildfly,并开始分析飞行记录。


修改引导类路径可能会产生副作用。我建议使用相互兼容的Java和Java Mission Control版本。这个答案https://stackoverflow.com/a/76572799/345057概述了具体方法。 - f4lco
修改引导类路径可能会产生副作用。我建议使用能够相互配合的Java和Java Mission Control版本。答案https://stackoverflow.com/a/76572799/345057概述了这种方法。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接