23

現在、Java VMをcom.sun.management.jmxremote.*プロパティで起動しているので、管理と監視のためにJConsoleを介してJavaVMに接続できます。残念ながら、マシン上のすべてのインターフェイス(IPアドレス)でリッスンします。

私たちの環境では、1台のマシンで同時に複数のJavaVMが実行されている場合がよくあります。(を使用して)異なるTCPポートでリッスンするようにJMXに指示するcom.sun.management.jmxremote.portことは可能ですが、代わりにJMXに標準のJMXポートを使用させ、(すべてではなく)特定のIPアドレスにバインドさせると便利です。

これにより、JConsoleを介して接続しているVMを簡単に把握できます(各VMが独自のIPアドレスを効果的に「所有」しているため)。JMXに単一のIPアドレスまたはホスト名でリッスンさせる方法を誰かが理解しましたか?

4

7 に答える 7

8

フェルナンドはすでに私のブログ投稿へのリンクを提供しています:)..それは些細なことではありません。必要なアドレスにソケットを作成する独自のRMIServerSocketFactoryImplを提供する必要があります。

内部/外部インターフェイスに問題があり、ローカルアクセスがある場合は、ローカルファイアウォールを設定する方が簡単な場合があります。

于 2008-12-02T01:51:39.640 に答える
0

私はこれを試していませんが、これが役立つかもしれません。

ここでの主な厄介な点は、JMX がバインドするホスト IP アドレスを指定する簡単な方法がないことです。これは常にすべてのインターフェースにバインドされます。「java.rmi.server.hostname」プロパティが機能せず、同じホスト上のすべての異なるインスタンスに対して異なるポートを選択したくありませんでした。

また、関連するすべての複雑さを伴う独自の RMIServerSocketFactory を作成したくなかったので、既存のコードに簡単なパッチを適用したかったのです。

このサーバー ソケットの作成を担当するデフォルトの JVM RMI ソケット ファクトリにパッチを適用することで、これを修正しました。新しい「com.sun.management.jmxremote.host」プロパティをサポートするようになりました。

これを機能させるには、以下の Java コードを sun/rmi/transport/proxy/RMIDirectSocketFactory.java という名前のファイルに保存します。

そこから jmx_patch.jar をコンパイルして作成し、それを tomcat lib/ フォルダーに配置します。

次に、次の行を bin/setenv.sh に追加する必要があります。

CLASSPATH=$CLASSPATH:$CATALINA_HOME/lib/mx_patch.jar

このオプションを tomcat インスタンスの起動時に追加します

-Dcom.sun.management.jmxremote.host=192.168.100.100"

これにより、JMX サービスがアドレス 192.168.100.100 にのみバインドされます。他の 2 つのランダムな RMI リスニング ポートは引き続きすべてのインターフェイスにバインドされますが、いずれにせよ常に空いているポートを選択するので問題ありません。

すべてのデフォルト ポートをそのまま使用して、1 つのホスト上で複数の tomcat インスタンスを実行できるようになりました (たとえば、すべての JMX に 8080 を使用)。

package sun.rmi.transport.proxy;

import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.rmi.server.RMISocketFactory;

public class RMIDirectSocketFactory extends RMISocketFactory {

    public Socket createSocket(String host, int port) throws IOException
    {
     return new Socket(host, port);
    }

   public ServerSocket createServerSocket(int port) throws IOException
   {
   String jmx_host = System.getProperty("com.sun.management.jmxremote.host");
   String jmx_port = System.getProperty("com.sun.management.jmxremote.port");

  // Allow JMX to bind to specific address
  if (jmx_host != null && jmx_port != null && port != 0 && integer.toString(port).equals(jmx_port)) {
    InetAddress[] inetAddresses = InetAddress.getAllByName(jmx_host);
    if (inetAddresses.length > 0) {
    return new ServerSocket(port, 50, inetAddresses[0]);
   }
}

 return new ServerSocket(port);
  }

}

于 2016-08-09T19:45:02.410 に答える
-3

受け入れられた答えはかなり古いです。Java がこれを有効にするためのいくつかのオプションを提供するようになったことを示すいくつかの兆候があります。たとえば、私は見ました:

-Djava.rmi.server.hostname=<YOUR_IP>

...としても...

-Dcom.sun.management.jmxremote.host=<YOUR_IP>

ただし、少なくとも jdk 1.7 の下の私のシステムでは、これらは何の効果もないようです。JMX コネクタはまだ *. 更新された回答(特定の適用可能なバージョンを含む)をいただければ幸いです。これは単純なはずです。

于 2014-09-15T19:11:38.947 に答える