如何确定当前正在使用的远程RMI服务器端口

时间:2015-09-03 12:25:20

标签: java rmi jmx jmc

我在某个远程服务器上运行了一个java进程(在java 7上),我希望使用Java Mission Control进行监视。但是,JMC无法连接,虽然我可以使用端口jmx远程端口telnet到服务器(这里是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端口。)

2 个答案:

答案 0 :(得分: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,则其值(您的&#34;某些IP地址&#34;)是客户端连接的位置。如果该值不是目标计算机的地址,或者是解析(对于客户端)到目标计算机的地址的名称,则它不会连接。如果您没有指定它,则默认为(编辑)InetAddress.getLocalHost()确定的值,该值至少应该是该计算机的有效地址。

答案 1 :(得分:0)

添加'-Dcom.sun.management.jmxremote.rmi.port = 12345'可以提供帮助

请参阅Why Java opens 3 ports when JMX is configured?