如何连接运行在WSL2中的JMX服务器

6
我正在使用以下参数运行Java应用程序,这些参数启用了JMX服务器的远程连接:
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.port=9998
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

我可以通过 VisualVM 添加新的 JMX 连接地址 <HOSTNAME>:9998 成功连接到该 JMX 服务器。

但是,当我在 Windows Subsystem for Linux 2 (WSL2) 中运行该应用程序时,Visual VM 无法连接到 localhost:9998连接失败

据我所知,WSL2 中应用程序监听的每个端口也都在主机机器上开放了(Windows 本身),我可以使用 Win+R -> cmd -> telnet localhost 9998 来检查(连接成功)。 此外,我在 WSL2 中正在运行 nginx 实例,我可以通过其它任何浏览器在主机机器上(Windows)使用 localhost 进行访问。

4个回答

5

我无法使用上述任何建议使 Windows jconsole 连接到在 WSL2 中运行的 JVM,但现在可以使用 Windows 11 的 Linux GUI 支持 在 WSL2 中运行 Linux jconsole。 运行得非常完美。


1
你是指这个吗?在Windows子系统上运行Linux GUI应用程序 - Martynas Jusevičius

3

我曾经遇到相同的问题,最终我找到了一组适用于我的WSL2的属性设置。此外,我还有一个额外的要求,需要在WSL2内运行docker容器,同时JConsole/VisualVM在Windows主机上运行。我还有一个VPN正在运行,这可能会更加混乱网络。

我发现这个应用程序https://github.com/cluther/jmx-tester非常有用,可以用来调试连接。

在WSL2内部

java \
-Dcom.sun.management.jmxremote=true \
-Djava.rmi.server.hostname=127.0.0.1 \
-Dcom.sun.management.jmxremote.port=9991 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.registry.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-Djava.net.preferIPv4Stack=true \
-jar jmx-tester-1.0.0.jar

然后在 Windows 主机上,将 JMX 连接到 127.0.0.1:9991

WSL2 中的 Docker 容器

java \
-Dcom.sun.management.jmxremote=true \
-Djava.rmi.server.hostname=127.0.0.1 \
-Dcom.sun.management.jmxremote.host=0.0.0.0 \
-Dcom.sun.management.jmxremote.port=9991 \
-Dcom.sun.management.jmxremote.rmi.port=9991 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.registry.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-Djava.net.preferIPv4Stack=true \
-jar jmx-tester-1.0.0.jar

然后在 Windows 主机上连接 JMX 到 127.0.0.1:9991


1
提到“java.rmi.server.hostname”(这正是我需要的,而其他更近期的回答似乎缺乏),以便能够从Windows连接到WSL2。我想知道在告诉客户端要使用哪个端口时,主机是否还会发送IP /主机名以进行连接,在我的情况下,如果没有设置该属性,则其它内容不是本地主机。 - zagrimsan
天啊,这真的起作用了!非常感谢。你是怎么想到的? - Martynas Jusevičius

1

在我的情况下,这取决于java.net.preferIPv6Addresseshttps://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/net/doc-files/net-properties.html

默认值为false。

我有一个运行在WSL2上的服务器和一个运行在Win11上的客户端:

c:>java -Djava.net.preferIPv6Addresses=system my.My2 http://localhost:8025
http://localhost:8025
{"timestamp":"2022-04-22T10:25:03.819+00:00","status":"404","error":"Not Found","path":"/"}

c:>java -Djava.net.preferIPv6Addresses=true my.My2 http://localhost:8025
http://localhost:8025
{"timestamp":"2022-04-22T10:25:14.544+00:00","status":"404","error":"Not Found","path":"/"}

c:>java -Djava.net.preferIPv6Addresses=false my.My2 http://localhost:8025
http://localhost:8025
Exception in thread "main" java.net.ConnectException
        at java.net.http/jdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:571)
        at java.net.http/jdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:123)
        at my.My2.main(My2.java:15)
Caused by: java.net.ConnectException
...

c:>java  my.My2 http://localhost:8025
http://localhost:8025
Exception in thread "main" java.net.ConnectException
        at java.net.http/jdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:571)
        at java.net.http/jdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:123)
        at my.My2.main(My2.java:15)
Caused by: java.net.ConnectException
...

0

你的意思是使用“-D=com.sun.management.jmxremote.host=0.0.0.0”吗? - usuario

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