私はこれを試していませんが、これが役立つかもしれません。
ここでの主な厄介な点は、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);
}
}