103

リモート マシンで実行されている Java アプリケーションへの JMX 接続を開こうとしています。

アプリケーション JVM は、次のオプションで構成されます。

  • com.sun.management.jmxremote
  • com.sun.management.jmxremote.port=1088
  • com.sun.management.jmxremote.authenticate=false
  • com.sun.management.jmxremote.ssl=false

localhost:1088jconsole または jvisualvm を使用して接続できます。xxx.xxx.xxx.xxx:1088しかし、リモートマシンから接続できません。

サーバー間または OS 上にファイアウォールはありません。しかし、この可能性を排除するためにtelnet xxx.xxx.xxx.xxx 1088、コンソール画面が空白になるので、私と私はそれがつながると思います。

どちらのサーバーも Windows Server 2008 x64 です。64 ビット JVM と 32 ビットで試してみましたが、どちらも機能しません。

4

12 に答える 12

123

Linux 上にあった場合、問題はlocalhost がループバック インターフェイスであることです。アプリケーションをネットワーク インターフェイスにバインドする必要があります。

netstat を使用して、予想されるネットワーク インターフェイスにバインドされていないことを確認できます。

環境変数java.rmi.server.hostname="YOUR_IP"として、または

java -Djava.rmi.server.hostname=YOUR_IP YOUR_APP
于 2009-05-07T13:31:17.163 に答える
69

JMXをローカルホストの外部から動作させるために1日以上費やしました。SUN/Oracleはこれに関する優れたドキュメントを提供できなかったようです。

次のコマンドが実際のIPまたはホスト名を返すことを確認してください。127.0.0.1、127.0.1.1、localhostなどが返される場合は機能せず、/etc/hostsファイルを更新する必要があります。

hostname -i

外部からでもJMXを有効にするために必要なコマンドは次のとおりです

-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.port=1100
-Djava.rmi.server.hostname=myserver.example.com

あなたが想定したように、myserver.example.comはhostname -i返されるものと一致する必要があります。

明らかに、ファイアウォールがあなたをブロックしていないことを確認する必要がありますが、これはあなたの問題ではなく、文書化されていない最後のパラメータであるとほぼ確信しています。

于 2012-07-25T16:24:48.217 に答える
27

Tomcat と Java 8 を使用した私のテストでは、JVM は JMX 用に指定されたポートに加えて一時的なポートを開いていました。次のコードは私を修正しました。JMX クライアントで問題が発生している場合 ( VisualVMが接続されていないなど)は、試してみてください。

-Dcom.sun.management.jmxremote.port=8989
-Dcom.sun.management.jmxremote.rmi.port=8989

また、JMX が構成されているときに Java が 3 つのポートを開くのはなぜですか?も参照してください。

于 2016-10-05T18:14:04.857 に答える
12

http://blogs.oracle.com/jmxetc/entry/troubleshooting_connection_problems_in_jconsole

NAT の背後にあるサーバーにアクセスしようとしている場合は、ほとんどの場合、オプションを使用してサーバーを起動する必要があります。

-Djava.rmi.server.hostname=<public/NAT address>

これにより、クライアントに送信される RMI スタブにサーバーのパブリック アドレスが含まれ、クライアントが外部からアクセスできるようになります。

于 2011-09-08T21:04:18.133 に答える
8

あなたの最後の引用が早すぎるようです。最後のパラメーターの後にある必要があります。

このトリックは私にとってはうまくいきました。

次のコマンド ラインを使用してアプリケーションを起動すると、興味深いことに気付きました。

java -Dcom.sun.management.jmxremote.port=9999
     -Dcom.sun.management.jmxremote.authenticate=false
     -Dcom.sun.management.jmxremote.ssl=false

jconsole を使用してリモート マシンからこのポートに接続しようとすると、TCP 接続が成功し、リモート jconsole と MBean がデプロイされているローカル jmx エージェントの間でデータが交換され、jconsole に接続エラー メッセージが表示されます。Wireshark キャプチャを実行したところ、エージェントと jconsole の両方からのデータ交換が示されました。

したがって、これはネットワークの問題ではありません。java.rmi.server.hostname システム プロパティを使用して、または使用せずに netstat -an を実行すると、次のバインディングが得られます。

 TCP    0.0.0.0:9999           0.0.0.0:0              LISTENING
 TCP    [::]:9999              [::]:0                 LISTENING

どちらの場合も、ポート 9999 で作成されたソケットは、任意のアドレスの任意のホストからの接続を受け入れることを意味します。

このシステム プロパティの内容は、接続のどこかで使用され、エージェントが jconsole と通信するために使用する実際の IP アドレスと比較されると思います。そしてそれらのアドレスが一致しない場合、接続は失敗します。

jconsole を使用して同じホストから接続している間は、この問題は発生しませんでした。実際の物理的なリモート ホストからのみ接続していました。したがって、このチェックは「外部」からの接続の場合にのみ行われると思います。

于 2010-06-18T10:27:36.083 に答える
7

私にとってうまくいったのは、/etc/hosts を設定して、ホスト名がループバック インターフェイスではなく IP を指すようにし、アプリケーションを再起動することでした。

猫 /etc/hosts

127.0.0.1      localhost.localdomain localhost
192.168.0.1    myservername

これは私の構成です:

-Dcom.sun.management.jmxremote.port=1617 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false
于 2014-12-02T09:01:22.047 に答える
5

どうもありがとう、それは次のように機能します:

java -Djava.rmi.server.hostname = xxx.xxx.xxx.xxx -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false - Dcom.sun.management.jmxremote.port=25000 -jar myjar .jar

于 2014-03-11T14:42:49.873 に答える
0

私は同じ問題を抱えており、ローカルホスト名と一致するホスト名を 0.0.0.0 に変更すると、それが機能するようです。

于 2012-05-10T20:13:53.253 に答える