0

Java Mission Control を使用して監視したいリモート サーバーで (Java 7 で) Java プロセスを実行しています。ただし、ポート jmx リモート ポート (ここでは 12345、以下を参照) を使用してサーバーに telnet で接続できますが、JMC は接続できません。

リモート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);
    }
}

syspropjava.rmi.server.hostnameが指定されている場合、その値 (「何らかの IP アドレス」) はクライアントが接続する場所であることに注意してください。その値がターゲット マシンのアドレスでない場合、または (クライアントの場合) ターゲット マシンのアドレスに解決される名前でない場合、接続されません。指定しない場合、そのマシンの有効なアドレスであるか、少なくとも有効なアドレスであると判断された値がデフォルトになります(編集) 。InetAddress.getLocalHost()

于 2015-09-04T03:02:24.913 に答える