2012-01-04 45 views
3

我試圖JConsole中連接到由調用的JVM:的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的第二個連接超時,並且jconsole應用程序報告「連接失敗」並終止第一個連接。爲什麼要嘗試第二次連接?有沒有辦法指定第二個連接的端口?目標服務器受到嚴格控制,其他端口被防火牆規則阻止。在多次連接嘗試中,第二個端口將更改爲不同的隨機值。

感謝您的幫助, 史蒂夫

+0

你確定你的機器上沒有防火牆阻止12700?我懷疑是因爲一些阻塞,jmx嘗試替代端口。嘗試禁用防火牆。 – kosa 2012-01-05 15:31:15

+0

當我嘗試從本地機器連接時,遠程機器顯示以下內容:'wse2tst @ tdiap12:〜> netstat -a | grep 12700 tcp 0 0 *:12700 *:* LISTEN tcp 0 0 tdiap12.vgcar.net:12700 per-00c0016253a2.vgca:12252 ESTABLISHED '我假設連接正在建立並且未被阻止本地防火牆規則。數據包跟蹤還表示連接成功。 – Steven 2012-01-05 19:20:17

+0

我想你需要添加-Dcom.sun.management.jmxremote,同時調出你在這個問題上指定的jvm,我們不需要嗎? – kosa 2012-01-05 19:37:44

回答

6

的外的開箱JMX實現使用兩個端口 - 一個用於這是隨機選擇的註冊表(您指定的一個),一個用於實際的連接(!)。這是一個設計上的缺陷,因爲隨機選擇第二個端口使得配置防火牆非常困難。

然而,有一些方法可以 - 或者你可以自己做manually,或者如果你使用的是Tomcat,你可以讓它handle it for you。比使用手動編碼劑

+0

原來另一位開發人員已經編寫了一個自定義代理來解決阻止第二個隨機端口的防火牆問題。我決心要解決問題的根本,而不是在需要監控的地方安裝自定義代理。 (我必須監視大量的應用程序服務器。)我非常沮喪,因爲我從來沒有找到識別第二個端口要求的文檔,但是您至少證實了我的觀察結果,這對我來說已經足夠了。感謝你的回答。 – Steven 2012-02-22 19:44:48

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」設置第二個端口,其中端口號可以與第一個端口號相同。即使在設置它之後,它將促使不安全的連接...請允許不安全的連接,然後只有它會允許您進一步進行,否則在日誌中您將發現錯誤無法連接:java.lang.SecurityException:期待sun.rmi .server.UnicastRef2在存根中的遠程引用!

謝謝