2012-01-04 38 views
3

私はによって呼び出さJVMにjconsoleを接続しようとしている:のJavaのjconsole JMX接続の失敗

java \ 
-Djava.util.logging.config.file=./logging.properties \ 
-Dcom.sun.management.jmxremote.ssl=false \ 
-Dcom.sun.management.jmxremote.authenticate=false \ 
-Dcom.sun.management.jmxremote.port=12700 \ 
-cp . Sleep 

私は、その後でjconsoleを起動しよう:

jconsole -J-Djava.util.logging.config.file=./logging.properties 

loggin.propertiesファイルが含まれています:

sun.rmi.level=FINEST 

ポート12700へのソケットを開いた後、rmiは別のポートで接続を試みるように見えます。

FINER: [javax.management.remote.rmi.RMIConnector: jmxServiceURL=service:jmx:rmi:///jndi/rmi://10.40.243.12:12700/jmxrmi] connecting... 
Jan 5, 2012 2:30:42 PM RMIConnector connect 
FINER: [javax.management.remote.rmi.RMIConnector: jmxServiceURL=service:jmx:rmi:///jndi/rmi://10.40.243.12:12700/jmxrmi] finding stub... 
Jan 5, 2012 2:30:43 PM sun.rmi.transport.tcp.TCPEndpoint <clinit> 
FINE: JConsole.addHost: localHostKnown = true, localHost = 10.206.6.59 
Jan 5, 2012 2:30:43 PM sun.rmi.server.UnicastRef newCall 
FINE: JConsole.addHost: get connection 
Jan 5, 2012 2:30:43 PM sun.rmi.transport.tcp.TCPTransport <init> 
FINE: JConsole.addHost: Version = 2, ep = [10.206.6.59:0] 
Jan 5, 2012 2:30:43 PM sun.rmi.transport.tcp.TCPEndpoint getLocalEndpoint 
FINE: JConsole.addHost: created local endpoint for socket factory null on port 0 
Jan 5, 2012 2:30:43 PM sun.rmi.transport.tcp.TCPChannel createConnection 
FINE: JConsole.addHost: create connection 
Jan 5, 2012 2:30:43 PM sun.rmi.transport.tcp.TCPEndpoint newSocket 
FINER: JConsole.addHost: opening socket to [10.40.243.12:12700] 
Jan 5, 2012 2:30:43 PM sun.rmi.transport.proxy.RMIMasterSocketFactory createSocket 
FINE: JConsole.addHost: host: 10.40.243.12, port: 12700 
Jan 5, 2012 2:30:43 PM sun.rmi.transport.tcp.TCPChannel createConnection 
FINER: JConsole.addHost: server suggested 10.206.6.59:12306 
Jan 5, 2012 2:30:43 PM sun.rmi.transport.tcp.TCPChannel createConnection 
FINER: JConsole.addHost: using 10.206.6.59:0 
Jan 5, 2012 2:30:43 PM sun.rmi.server.UnicastRef newCall 
FINER: JConsole.addHost: create call context 
Jan 5, 2012 2:30:43 PM sun.rmi.server.UnicastRef logClientCall 
FINER: JConsole.addHost: outbound call: [endpoint:[10.40.243.12:12700](remote),objID:[0:0:0, 0]] : sun.rmi.registry.RegistryImpl_Stub[0:0:0, 0]: java.rmi.Remote lookup(java.lang.String) 
Jan 5, 2012 2:30:43 PM sun.rmi.transport.StreamRemoteCall <init> 
FINER: JConsole.addHost: write remote call header... 
Jan 5, 2012 2:30:43 PM sun.rmi.transport.StreamRemoteCall getOutputStream 
FINER: JConsole.addHost: getting output stream 
Jan 5, 2012 2:30:43 PM sun.rmi.server.UnicastRef invoke 
FINER: JConsole.addHost: execute call 
Jan 5, 2012 2:30:43 PM sun.rmi.transport.StreamRemoteCall getInputStream 
FINER: JConsole.addHost: getting input stream 
Jan 5, 2012 2:30:43 PM sun.rmi.server.LoaderHandler loadClass 
FINE: JConsole.addHost: name = "javax.management.remote.rmi.RMIServerImpl_Stub", codebase = "", defaultLoader = [email protected] 
Jan 5, 2012 2:30:43 PM sun.rmi.server.LoaderHandler loadClass 
FINER: JConsole.addHost: class "javax.management.remote.rmi.RMIServerImpl_Stub" found via defaultLoader, defined by null 
Jan 5, 2012 2:30:43 PM sun.rmi.server.LoaderHandler loadClass 
FINE: JConsole.addHost: name = "java.rmi.server.RemoteStub", codebase = "", defaultLoader = [email protected] 
Jan 5, 2012 2:30:43 PM sun.rmi.server.LoaderHandler loadClass 
FINER: JConsole.addHost: class "java.rmi.server.RemoteStub" found via defaultLoader, defined by null 
Jan 5, 2012 2:30:43 PM sun.rmi.server.LoaderHandler loadClass 
FINE: JConsole.addHost: name = "java.rmi.server.RemoteObject", codebase = "", defaultLoader = [email protected] 
Jan 5, 2012 2:30:43 PM sun.rmi.server.LoaderHandler loadClass 
FINER: JConsole.addHost: class "java.rmi.server.RemoteObject" found via defaultLoader, defined by null 
Jan 5, 2012 2:30:43 PM sun.rmi.server.UnicastRef done 
FINE: JConsole.addHost: free connection (reuse = true) 
Jan 5, 2012 2:30:43 PM sun.rmi.transport.tcp.TCPChannel free 
FINE: JConsole.addHost: reuse connection 
Jan 5, 2012 2:30:43 PM sun.rmi.transport.tcp.TCPChannel free 
FINE: JConsole.addHost: create reaper 
Jan 5, 2012 2:30:43 PM sun.rmi.server.UnicastRef newCall 
FINE: JConsole.addHost: get connection 
Jan 5, 2012 2:30:43 PM sun.rmi.transport.tcp.TCPChannel createConnection 
FINE: JConsole.addHost: create connection 
Jan 5, 2012 2:30:43 PM sun.rmi.transport.tcp.TCPEndpoint newSocket 
FINER: JConsole.addHost: opening socket to [tdiap12:41096] 
Jan 5, 2012 2:30:43 PM sun.rmi.transport.proxy.RMIMasterSocketFactory createSocket 
FINE: JConsole.addHost: host: tdiap12, port: 41096 

最初の接続試行は、リモートサーバーでESTABLISHED接続が表示されるため、成功しました。

[email protected]:~> netstat -a | grep 12700 
tcp  0  0 *:12700      *:*       LISTEN  
tcp  0  0 tdiap12.vgcar.net:12700  per-00c0016253a2.vgca:12252 ESTABLISHED 

パケットトレースは接続に成功したことを示します。

ポート41096への2回目の接続がタイムアウトし、jconsoleアプリケーションが「接続失敗」を報告し、最初の接続も終了します。 2番目の接続が試行されるのはなぜですか?この2番目の接続にポートを指定する方法はありますか?ターゲットサーバは厳密に制御され、他のポートはファイアウォールルールによってブロックされます。複数の接続試行では、2番目のポートは異なるランダム値に変更されます。レジストリ(あなたが指定したもの)ごとに1つのランダムに選択された実際の接続のための1 - 任意の助け

おかげで、 スティーブ

+0

あなたのマシンにはファイアウォールが12700をブロックしないことを確認していますか?私は、いくつかのブロック、jmxが代替ポートを試していると思われます。ファイアウォールを無効にしてみてください。 – kosa

+0

私のローカルマシンから接続しようとすると、リモートマシンは次のように表示されます: 'wse2tst @ tdiap12:〜> netstat -a | grep 12700 tcp 0 0:12700 *:* LISTEN tcp 0 0 tdiap12.vgcar.net:12700 00c0016253a2.vgca:12252 ESTABLISHED '接続が確立されており、ローカルファイアウォールルール。パケットトレースは、接続が成功したことも示します。 – Steven

+0

私はこの質問の上に指定したjvmを起動している間に-Dcom.sun.management.jmxremoteを追加する必要があります。 – kosa

答えて

6

は、アウトオブボックスのJMX実装では、2つのポートを使用しています(!)。 2番目のポートをランダムに選択すると、ファイアウォールを構成するのが非常に難しくなるため、これはかなりの設計上の欠陥です。

しかし、あなた自身でそれを行うことができます。manually、またはTomcatを使用している場合はhandle it for youとしてください。

+0

別の開発者が、カスタムエージェントを既にコーディングしていて、第2のランダムポートをブロックしているファイアウォールの問題を回避していることが分かりました。私は監視する必要があるどこでもカスタムエージェントをインストールする必要はなく、問題の最下部に到達することに決めました。 (私は数多くのアプリケーションサーバーを監視する必要があります)私は第2ポートの要件を特定する文書を見つけたことはないので、非常に不満を抱いていましたが、少なくとも私の観察結果を確認してくれました。答えをありがとう。 – Steven

5

新しいと手動でコード化されたエージェントを使用するよりも、よりよい解決策は、Javaの7で導入されているように見える新しいパラメータを使用することです:

-Dcom.sun.management.jmxremote.rmi.port=7091

ので、組み合わせて - 同じポートを使用することができます。

をここで見つける

-Dcom.sun.management.jmxremote.port=7091 -Dcom.sun.management.jmxremote.rmi.port=7091

ソリューション: http://hirt.se/blog/?p=289

0

パラメータ "Dcom.sun.management.jmxremote.rmi.port"で2番目のポートを設定できます。ポート番号は最初のポート番号と同じにすることができます。これを設定した後でさえ、安全でない接続を宣言します...安全でない接続を許可してください。そうしないと、ログに次のようなメッセージが表示され、接続できませんでした:java.lang.SecurityException:sun.rmi .server.UnicastRef2スタブのリモート参照!

おかげ

関連する問題