1

我想将 jmx 与 Jconsole 一起使用。这是 .sh 文件中的相关行

## enable jconsole access
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote  -Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.password.file=/usr/pkg/tomcat-rusznak/jmxremote.password -Dcom.sun.management.jmxremote.access.file=/usr/pkg/tomcat-rusznak/jmxremote.access -Djava.rmi.server.hostname=ba.accra.com"

这是 jmxremote.password 文件的内容

monitorRole password
controlRole password

这是 jmxremote.access 文件的内容

monitorRole   readonly
controlRole   readwrite \
              create javax.management.monitor.*,javax.management.timer.* \
              unregister

但是,当我提供正确的主机名、端口并尝试使用 monitorRole - 密码对登录时,我得到的只是:

Connection failed: connection refused.

为什么?

我检查了很多类似的问题,例如我从stackoverflow知道我也需要包含主机名(-Djava.rmi.server.hostname=ba.accra.com),但这并没有解决问题,显然是失踪。我还需要什么?

已编辑

我不知道它是否相关,但我想补充一点,我在本地启动 jconsole 没有问题 (尽管连接总是被拒绝)但我什至无法在服务器上启动它!

jconsole: not found
4

2 回答 2

2

我有一个解决方案:

另见:https ://stackoverflow.com/a/17457394/1531271

如果您的Java 进程在防火墙后面的 Linux 上运行,并且您想在本地计算机上的 Windows 上启动 Jconsole。

注意:如果您没有 putty.exe(如果您是 linux oder mac os 用户),您也可以使用 ssh 命令添加隧道


1. 您需要从这里为您的 Windows 机器安装 putty-suite:

http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

至少putty.exe


2.首先在linux机器上查看ip地址

hostname -i

result ---> <your-linux-ip-adress>

例子:

your-linux-ip-adress = 10.20.30.40


3.在你的linux机器上定义两个空闲端口:

<jmx-remote-port>
<jndi-remote-port>

例子:

jmx-remote-port = 15666      
jndi-remote-port = 15667


4.给linux机器上的java进程添加参数

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=<jmx-remote-port>
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.local.only=false
-Djava.rmi.server.hostname=<your-linux-ip-adress>
-Djava.rmi.activation.port=<jndi-remote-port>

例子:

java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=15666 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.local.only=false -Djava.rmi.server.hostname=10.20.30.40 -Djava.rmi.activation.port=15667 ch.sushicutta.jmxremote.Main


5. 在你的 Windows 机器上使用 putty 启用两个 SSH 隧道

Source port: <jmx-remote-port>
Destination: <your-linux-ip-adress>:<jmx-remote-port>
[x] Local       
[x] Auto       

Source port: <jndi-remote-port>
Destination: <your-linux-ip-adress>:<jndi-remote-port>
[x] Local       
[x] Auto

例子:

Source port: 15666
Destination: 10.20.30.40:15666
[x] Local       
[x] Auto       

Source port: 15667
Destination: 10.20.30.40:15667
[x] Local       
[x] Auto


6. 登录到您的 Linux 机器并启用此 SSH 隧道。

当您登录时,Putty 会将所有 TCP 连接隧道连接到

localhost:15666 and localhost:15667

10.20.30.40:15666 and 10.20.30.40:15667


7. 启动 JConsole 并使用以下 URL 连接到您的 Java 进程

[x] Remote Process:
service:jmx:rmi://localhost:**<jndi-remote-port>**/jndi/rmi://localhost:<jmx-remote-port>/jmxrmi

例子:

[x] Remote Process:
service:jmx:rmi://localhost:15667/jndi/rmi://localhost:15666/jmxrmi


8.享受:)

于 2013-07-04T07:31:58.600 回答
0

好的,实际上,默认情况下启用了以下选项:

  • com.sun.management.jmxremote.authenticate
  • com.sun.management.jmxremote.ssl

正如这里所解释的,如果您启用了 SSL,则需要在正确配置 SSL 的情况下运行您的 JConsole。我认为您应该尝试通过在启动应用程序的脚本中添加此选项来禁用 SSL:com.sun.management.jmxremote.ssl=false

于 2013-05-06T13:31:04.997 回答