web-dev-qa-db-ja.com

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ファイアウォールが無効になっています。

6
Ivan Mushketyk

原因:Java.rmi.ConnectException:ホストへの接続が拒否されました:127.0.0.1;ネストされた例外は:

ほとんどの場合、正しいJVMパラメータでサーバーを実行していません。 Jconsoleは、ローカルプロセスを見つけて接続するために、異なるメカニズムを使用します。クライアントコードがTCP/IPを使用してサーバーに接続しようとしています。これをオンにするには、次のようなものをサーバーのJavaコマンドラインに追加する必要があります。

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

参照: jconsoleを使用してアクセスするためにJVMでJMXをアクティブにする方法

余談ですが、このコードをすべて実行するmy SimpleJMX library の使用を検討してください。 JMXクライアントコードも含まれています。

9
Gray

同じエラーが発生しました。私の場合、@ PostConstructアノテーションを使用していて、Springが接続を構成する前に、そのメソッドがRMI接続を使用しようとしていました。

結局、接続の構成に問題があったわけではなく、準備ができる前に誤って使用しようとしただけです。これが誰かに役立つことを願っています。

1
Ryan D

次の方法で、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. 管理者権限で実行

1
GKislin

tomcatのbinフォルダーでcatalina.shファイルを確認します。それを開いて、Javaサーバーパラメータを見つけます。必要な行の$ Java_OPTSに以下を追加します。

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

完了です!

0
Kıvılcım