0

我在想要使用 Java Mission Control 监控的某个远程服务器上运行了一个 java 进程(在 java 7 上)。但是,JMC 无法连接,尽管我可以使用端口 jmx 远程端口(此处为 12345,见下文)远程登录到服务器。

远程java进程开始于

-Dcom.sun.management.jmxremote=true 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.port=12345 
-Djava.rmi.server.hostname=<some ip address>
-Dcom.sun.management.jmxremote.authenticate=false

这些对我来说似乎是正确的价值观。防火墙上已经开放了12345端口,但是我怀疑rmi服务器端口被防火墙屏蔽了。

因此,我的问题是:有没有办法(在服务器上使用 netstat 或者甚至从客户端使用 telnet)来确定 java 进程当前在服务器上使用哪个 rmi 服务器端口?(使用 netstat,我看到 java 进程使用了​​几个端口。但是,我不知道哪个是 rmi 端口。)

4

2 回答 2

0

这应该显示 JMX 远程客户端可能在超时后被告知连接到的位置(加上一些内部信息):

//nopackage -- move if you like
import java.rmi.Remote;
import java.rmi.registry.*;
import java.rmi.server.*;
import sun.rmi.server.UnicastRef;
import sun.rmi.transport.LiveRef;

public class JMXTarget {
    /*
     * run: java JMXTarget host port
     * where host (name or address) contains the JVM process offering JMX
     * and port (number) is the registry specified by -Dcom.sun.management.jmxremote.port 
     */
    public static void main(String[] args) throws Exception {
        Registry reg = LocateRegistry.getRegistry (args[0], Integer.parseInt(args[1]));
        Remote r = reg.lookup ("jmxrmi");
        RemoteObject ro = (RemoteObject)r; 
        RemoteRef rr = ro.getRef();
        UnicastRef ur = (UnicastRef)rr;
        LiveRef lr = ur.getLiveRef();
        System.out.println (lr);
    }
}

请注意,如果像您一样指定了 sysprop java.rmi.server.hostname,它的值(您的“某个 ip 地址”)就是客户端连接的位置。如果该值不是目标机器的地址,或者(对于客户端)解析为目标机器地址的名称,它将无法连接。如果您不指定它,它默认为(编辑)InetAddress.getLocalHost()哪个是或至少应该是该机器的有效地址所确定的值。

于 2015-09-04T03:02:24.913 回答
0

添加“-Dcom.sun.management.jmxremote.rmi.port=12345”可能会有所帮助

请参阅配置 JMX 时为什么 Java 会打开 3 个端口?

于 2015-09-04T07:26:21.550 回答