web-dev-qa-db-ja.com

「RMIServerスタブを取得できませんでした」JMXエラーを修正するにはどうすればよいですか?

Windows Server 2008 R2からUbuntu 10.04への移行を完了しました。パフォーマンスの問題があるJavaアプリケーション(Java 6、Tomcat)を管理しています。JMXを使用してトラブルシューティングを行いたいのですが、jvisualvmを接続できません。 。

Ps -ef | grep "Java"には、次のパラメーターが表示されます。

-Dcom.Sun.management.jmxremote.port=8084 
-Dcom.Sun.management.jmxremote.ssl=false 
-Dcom.Sun.management.jmxremote.authenticate=false

Netstatは、ポート8084が0.0.0.0で待機していることを示しています。私の構成では、JMXはサーバーのFQDNにバインドするようにセットアップされています(私たちはプライベートDNSサーバーを使用しています)。ファイアウォール(IPTABLES/UFW)は、すべての送信トラフィックを許可し、ポート8084での受信トラフィックを許可するように設定されています。

サーバー自体は、パブリックとプライベートの2つのNICを持つ仮想です。パブリックNICのゲートウェイは無効になっているため、接続はプライベート側でのみ行うことができます。

JMXを使用してjvisualvmをアプリサーバーに接続しようとすると、jvisualvmで次のエラーが発生します。

Cannot connect to [FQDN OMITTED]:8084 using server:jmx:rmi:///jndi/rmi://[FQDN OMITTED]:8084/jmxrmi

Jvisualvmログを確認すると、次のトレースが表示されます。

NFO [com.Sun.tools.visualvm.jmx.impl.JmxModelImpl]: connect(service:jmx:rmi:///jndi/rmi://[FQDN OMITTED]:8084/jmxrmi)
Java.io.EOFException: SSL peer shut down incorrectly
                at com.Sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.Java:333)
                at com.Sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.Java:789)
Caused: javax.net.ssl.SSLHandshakeException: Remote Host closed connection during handshake
                at com.Sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.Java:808)
                at com.Sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.Java:1120)
                at com.Sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.Java:623)
                at com.Sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.Java:59)
                at Java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.Java:65)
                at Java.io.BufferedOutputStream.flush(BufferedOutputStream.Java:123)
                at Java.io.DataOutputStream.flush(DataOutputStream.Java:106)
                at Sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.Java:211)
Caused: Java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is: 
                javax.net.ssl.SSLHandshakeException: Remote Host closed connection during handshake
                at Sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.Java:286)
                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)
Caused: javax.naming.CommunicationException [Root exception is Java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is: 
                javax.net.ssl.SSLHandshakeException: Remote Host closed connection during handshake]
                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:257)
Caused: Java.io.IOException: Failed to retrieve RMIServer stub
                at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.Java:338)
                at com.Sun.tools.visualvm.jmx.impl.JmxModelImpl$ProxyClient.tryConnect(JmxModelImpl.Java:451)
[catch] at com.Sun.tools.visualvm.jmx.impl.JmxModelImpl$ProxyClient.connect(JmxModelImpl.Java:395)
                at com.Sun.tools.visualvm.jmx.impl.JmxModelImpl.connect(JmxModelImpl.Java:216)
                at com.Sun.tools.visualvm.jmx.impl.JmxModelImpl.<init>(JmxModelImpl.Java:205)
                at com.Sun.tools.visualvm.jmx.impl.JmxModelProvider.createModelFor(JmxModelProvider.Java:61)
                at com.Sun.tools.visualvm.jmx.impl.JmxModelProvider.createModelFor(JmxModelProvider.Java:42)
                at com.Sun.tools.visualvm.core.model.ModelFactory.getModel(ModelFactory.Java:111)
                at com.Sun.tools.visualvm.tools.jmx.JmxModelFactory.getJmxModelFor(JmxModelFactory.Java:69)
                at com.Sun.tools.visualvm.jmx.impl.JmxApplicationProvider.addJmxApplication(JmxApplicationProvider.Java:267)
                at com.Sun.tools.visualvm.jmx.impl.JmxApplicationProvider.createJmxApplication(JmxApplicationProvider.Java:185)
                at com.Sun.tools.visualvm.jmx.JmxApplicationsSupport.createJmxApplicationImpl(JmxApplicationsSupport.Java:283)
                at com.Sun.tools.visualvm.jmx.JmxApplicationsSupport.createJmxApplicationInteractive(JmxApplicationsSupport.Java:261)
                at com.Sun.tools.visualvm.jmx.impl.AddJMXConnectionAction$1.run(AddJMXConnectionAction.Java:80)
                at org.openide.util.RequestProcessor$Task.run(RequestProcessor.Java:577)
                at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.Java:1030)

誰かアイデアはありますか?

5
GregB

問題は、ポート8084でリッスンするようにJMXが構成されている場合でも、初期接続が行われた後、JMXホストが残りの「会話」用に別のポートを動的に選択することです。ファイアウォールは8084を通過するトラフィックを許可しましたが、後続のトラフィックをブロックしていました。

2つのオプションがあります。

  1. すべての一時的なポートで受信トラフィックを許可します(いいね!)。
  2. 通信に単一のポートを使用するJMXラッパーを開発します。
3
GregB

JMXとRMIの両方の会話に same port を指定できます。

-Dcom.Sun.management.jmxremote.port=8084 
-Dcom.Sun.management.jmxremote.rmi.port=8084 
6
freedev

私は、JMXを介して(VisualVMを使用して)新しいTomcat8 VMに接続しようとするこの同じ問題に苦労しました。 Linuxチームは、トラブルシューティングのためにRedhatでチケットを開く必要がありました。しかし、私が問題を解決する前に、この記事を偶然見つけました。

上記の解決策は、

-Dcom.Sun.management.jmxremote.rmi.port=X

Xは、設定が何であっても一致する必要があります

-Dcom.Sun.management.jmxremote.port 

引数の完全なリスト:

-Dcom.Sun.management.jmxremote 
-Dcom.Sun.management.jmxremote.port=8091
-Dcom.Sun.management.jmxremote.rmi.port=8091
-Dcom.Sun.management.jmxremote.ssl=false
-Dcom.Sun.management.jmxremote.authenticate=false 
-Djava.rmi.server.hostname=MYHOST

これが他の誰かが同じ問題を抱えているのに役立つことを願っています。幸運を!

1
MaxRelax

Tomcat 9.0.9でも同じ問題があります。オン path/to/Tomcat/bin/setenv.sh、次の設定が私にとってうまくいきました:

CATALINA_OPTS="$CATALINA_OPTS 
-Dcom.Sun.management.jmxremote 
-Dcom.Sun.management.jmxremote.port=1099 
-Dcom.Sun.management.jmxremote.rmi.port=1099 
-Dcom.Sun.management.jmxremote.authenticate=false 
-Dcom.Sun.management.jmxremote.ssl=false 
-Djava.rmi.server.hostname=192.168.1.20 
-Djmx.rmi.registry.port=1099 
-Djmx.rmi.port=1099 
" 

export CATALINA_OPTS
0
Richi