【问题标题】:How to determine remote RMI server port currently in use如何确定当前正在使用的远程 RMI 服务器端口
【发布时间】:2015-09-03 12:25:19
【问题描述】:

我在想使用 Java Mission Control 监控的某个远程服务器上运行了一个 Java 进程(在 Java 7 上)。但是,JMC 无法连接,尽管我可以使用 port 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 端口。)

【问题讨论】:

  • 如果防火墙阻止它,您将获得连接超时。如果您有其他问题,请向我们倾诉。您的实际问题的答案是阅读您已经完成的配置。
  • 江铃的输出不是很能说明问题。我只说“无法连接”左右。而且需要很长时间。所以,是的,我猜这是连接超时...... :)
  • 关于配置:据我了解,有一个jmx端口和一个rmi端口。上面的配置只指定了一个 jmx 端口,我想知道是否有某种方法可以找出 rmi 端口(使用 netstat 给了我一些我的 java 进程正在监听的端口)。
  • 好的。现在我刚刚打开了我的 java 进程正在监听的所有端口,JMC 现在可以连接。知道确切的 RMI 端口仍然很高兴。将尝试 dave_thompsons 的建议。

标签: java rmi jmx jmc


【解决方案1】:

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

Why Java opens 3 ports when JMX is configured?

【讨论】:

    【解决方案2】:

    这应该显示 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 地址”)就是客户端连接的位置。如果该值不是目标机器的地址,或者(对于客户端)解析为目标机器地址的名称,它将无法连接。如果您不指定它,则默认为 (edit)InetAddress.getLocalHost() 确定的值,该值是或至少应该是该机器的有效地址。

    【讨论】:

    • 如果不指定,默认为服务器主机的公网IP地址。不是“本地”地址,即 127.0.0.1。
    • 好的。谢谢!将尝试查看它打印的内容。
    • @EJP 抱歉,我是想更好地填写它,但显然忘记了。谢谢提醒。
    猜你喜欢
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多