2014-03-01 98 views
2

我無法連接到JMX對象。這是我如何創建一個JMX對象:爲什麼我得到錯誤「連接被拒絕」與JMX

public static void main(String... args) { 
    MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); 
    try { 
     ObjectName name = new ObjectName("org.javasimon.jmx.example:type=Simon"); 
     if (mbs.isRegistered(name)) { 
      mbs.unregisterMBean(name); 
     } 
     SimonManagerMXBean simonManagerMXBean = new SimonManagerMXBeanImpl(SimonManager.manager()); 
     mbs.registerMBean(simonManagerMXBean, name); 
     System.out.println("SimonManagerMXBean registerd under name: "+name); 

    } catch (JMException e) { 
     System.out.println("SimonManagerMXBean registration failed!\n"+e); 
    } 

    while (true) { 
     // waiting for connections 
    } 
} 

這是連接到遠程JMX對象代碼:

JMXServiceURL url = new JMXServiceURL("service:jmx:rmi://127.0.0.1:9999/jndi/rmi://127.0.0.1:1099/jmxrmi"); 
JMXConnector jmxc = JMXConnectorFactory.connect(url, null); 
MBeanServerConnection mbsc = jmxc.getMBeanServerConnection(); 
SimonManagerMXBean simonManagerMXBean = JMX.newMXBeanProxy(mbsc, new ObjectName("org.javasimon.jmx.example:type=Simon"), SimonManagerMXBean.class); 
return simonManagerMXBean; 

可惜的是我收到以下錯誤:

java.io.IOException: Failed to retrieve RMIServer stub: javax.naming.ServiceUnavailableException [Root exception is java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is: 
    java.net.ConnectException: Connection refused: connect] 
    at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:338) 
    at javax.management.remote.JMXConnectorFactory.connect(JMXConnectorFactory.java:248) 
    at my.code.RemoteSimonManagerFactoryImpl.createSimonManager(RemoteSimonManagerFactoryImpl.java:24) 
    at my.code.Demo.main(DemoAggregation.java:21) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 
Caused by: javax.naming.ServiceUnavailableException [Root exception is java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is: 
    java.net.ConnectException: Connection refused: connect] 
    at com.sun.jndi.rmi.registry.RegistryContext.lookup(RegistryContext.java:101) 
    at com.sun.jndi.toolkit.url.GenericURLContext.lookup(GenericURLContext.java:185) 
    at javax.naming.InitialContext.lookup(InitialContext.java:392) 
    at javax.management.remote.rmi.RMIConnector.findRMIServerJNDI(RMIConnector.java:1886) 
    at javax.management.remote.rmi.RMIConnector.findRMIServer(RMIConnector.java:1856) 
    at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:255) 
    ... 9 more 
Caused by: java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is: 
    java.net.ConnectException: Connection refused: connect 
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:601) 
    at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:198) 
    at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:184) 
    at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:322) 
    at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source) 
    at com.sun.jndi.rmi.registry.RegistryContext.lookup(RegistryContext.java:97) 
    ... 14 more 
Caused by: java.net.ConnectException: Connection refused: connect 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351) 
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213) 
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) 
    at java.net.Socket.connect(Socket.java:529) 
    at java.net.Socket.connect(Socket.java:478) 
    at java.net.Socket.<init>(Socket.java:375) 
    at java.net.Socket.<init>(Socket.java:189) 
    at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22) 
    at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:128) 
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:595) 
    ... 19 more 

如果我嘗試使用「jconsole」實用程序連接到我的JMX服務器(對於本地進程),我首先得到「ConnectionFailedSSL1」錯誤,但是當我在錯誤表單中單擊「不安全」按鈕時,我成功連接。

服務器和客戶端都在同一臺計算機上。

我正在使用Windows 7 x64。 Windows防火牆被禁用。

回答

7

Caused by: java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is:

很可能你沒有使用正確的JVM參數運行你的服務器。 Jconsole使用不同的機制來查找並連接到本地進程。您的客戶端代碼嘗試使用TCP/IP連接到您的服務器。要打開這個你需要添加類似以下內容到你的Java命令行您的服務器上:

-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=1099 

參見:How to activate JMX on my JVM for access with jconsole?

順便說一句,你可能要考慮使用我的SimpleJMX library這爲你做所有這些代碼。它還包含一個JMX客戶端代碼。

+0

我是否需要在客戶端或服務器端添加此設置? –

+0

第一行顯示「未使用正確的JVM參數運行服務器」@IvanMushketyk。 – Gray

+0

它的工作原理。謝謝。正確的端口號是1099. –

0

我收到了同樣的錯誤。在我的情況下,我使用@PostConstruct註釋,並且該方法試圖在Spring有機會配置連接之前使用RMI連接。

這並沒有最終導致連接的配置出現問題,只是在準備好之前我不小心嘗試使用它。希望這可能有助於某人。

1

我管理由使用JMX(Tomcat的8,Windows)中運行Tomcat:

  1. 添加 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false

  2. 運行具有管理員權限

0

檢查你的tomcat的bin catalina.sh文件的文件夾。打開它並找到java服務器參數。在任何你想要的行上添加thoose關注到$ JAVA_OPTS。

-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=1099 

你完成了!

相關問題