Java 为什么我会犯错误;“拒绝连接”;使用JMX

Java 为什么我会犯错误;“拒绝连接”;使用JMX,java,networking,jmx,Java,Networking,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.isRegis

我无法连接到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
    }
}
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;
这是连接到远程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
    }
}
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
java.io.IOException:检索RMIServer存根失败:javax.naming.ServiceUnavailableException[根异常为java.rmi.ConnectException:拒绝连接到主机:127.0.0.1;嵌套异常为:
java.net.ConnectException:连接被拒绝:connect]
位于javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:338)
位于javax.management.remote.JMXConnectorFactory.connect(JMXConnectorFactory.java:248)
在my.code.RemoteSimonManagerFactoryImpl.createSimonManager(RemoteSimonManagerFactoryImpl.java:24)中
在my.code.Demo.main(DemoAggregation.java:21)中
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中
位于java.lang.reflect.Method.invoke(Method.java:597)
位于com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
原因:javax.naming.ServiceUnavailableException[根异常为java.rmi.ConnectException:拒绝连接到主机:127.0.0.1;嵌套异常为:
java.net.ConnectException:连接被拒绝:connect]
在com.sun.jndi.rmi.registry.RegistryContext.lookup(RegistryContext.java:101)上
位于com.sun.jndi.toolkit.url.GenericURLContext.lookup(GenericURLContext.java:185)
在javax.naming.InitialContext.lookup(InitialContext.java:392)中
位于javax.management.remote.rmi.RMIConnector.findRMIServerJNDI(RMIConnector.java:1886)
位于javax.management.remote.rmi.RMIConnector.findRMIServer(RMIConnector.java:1856)
位于javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:255)
... 9更多
原因:java.rmi.ConnectException:连接拒绝主机:127.0.0.1;嵌套异常是:
java.net.ConnectException:连接被拒绝:连接
位于sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:601)
位于sun.rmi.transport.tcp.tcpcchannel.createConnection(tcpcchannel.java:198)
位于sun.rmi.transport.tcp.tcpcchannel.newConnection(tcpcchannel.java:184)
位于sun.rmi.server.UnicastRef.newCall(UnicastRef.java:322)
位于sun.rmi.registry.RegistryImpl\u Stub.lookup(未知源)
在com.sun.jndi.rmi.registry.RegistryContext.lookup(RegistryContext.java:97)上
... 14多
原因:java.net.ConnectException:连接被拒绝:连接
位于java.net.PlainSocketImpl.socketConnect(本机方法)
位于java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
位于java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
在java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
位于java.net.socksocketimpl.connect(socksocketimpl.java:366)
位于java.net.Socket.connect(Socket.java:529)
位于java.net.Socket.connect(Socket.java:478)
位于java.net.Socket(Socket.java:375)
位于java.net.Socket(Socket.java:189)
位于sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22)
位于sun.rmi.transport.proxy.rmismastersocketfactory.createSocket(rmismastersocketfactory.java:128)
位于sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:595)
... 还有19个
如果我尝试使用“jconsole”实用程序连接到我的JMX服务器(与本地进程一样),我首先会得到“ConnectionFailedSSL1”错误,但当我单击错误表单中的“unsecure”按钮时,我成功连接

服务器和客户端都在同一台计算机上

我使用的是Windows7x64。Windows防火墙已禁用

原因:java.rmi.ConnectException:连接拒绝主机:127.0.0.1;嵌套异常是:

很可能您没有使用正确的JVM参数运行服务器。Jconsole使用不同的机制来查找和连接本地进程。您的客户端代码正在尝试使用TCP/IP连接到服务器。要启用此功能,您需要在服务器上的Java命令行中添加如下内容:

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


作为一个旁白,您可能需要考虑使用我的代码来为您做所有这些代码。它还包括一个JMX客户端代码。

我收到了相同的错误。在我的例子中,我使用了@PostConstruct注释,该方法试图在Spring有机会配置连接之前使用RMI连接


连接的配置并没有出现任何问题,只是在连接准备好之前我不小心尝试使用它。希望这可能会对某人有所帮助。

我通过以下方式管理使用JMX运行Tomcat(Tomcat 8,Windows):

  • -Dcom.sun.management.jmxremote
    -Dcom.sun.management.jmxremote.port=1099
    -Dcom.sun.management.jmxremote.ssl=false
    -Dcom.sun.management.jmxremote.authenticate=false

  • 使用管理员权限运行


  • 检查tomcat的bin文件夹中的catalina.sh文件。打开它并查找java服务器参数。将以下内容添加到$JAVA_OPTS的任意行中

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

    你完了

    我需要在客户端或服务器端添加此设置吗?第一行显示“不使用正确的JVM参数运行服务器”@IvanMushketyk.It有效。非常感谢。正确的端口号是1099。这些参数也适用于
    Ubuntu 20.04
    +
    Tomcat9