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ファイアウォールが無効になっています。
原因: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クライアントコードも含まれています。
同じエラーが発生しました。私の場合、@ PostConstructアノテーションを使用していて、Springが接続を構成する前に、そのメソッドがRMI接続を使用しようとしていました。
結局、接続の構成に問題があったわけではなく、準備ができる前に誤って使用しようとしただけです。これが誰かに役立つことを願っています。
次の方法で、JMX(Tomcat 8、Windows)で実行Tomcatを管理しています。
追加 -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
完了です!