Ich habe das nicht versucht, aber das kann helfen.
Das Hauptproblem hier war, dass es keine einfache Möglichkeit gibt, die Host-IP Adresse für JMX zu binden, es würde immer an alle Schnittstellen binden. Die Eigenschaft 'java.rmi.server.hostname' funktionierte nicht und ich wollte nicht verschiedene Ports für alle verschiedenen Instanzen auf demselben Host auswählen.
Auch ich wollte meine eigene RMIServerSocketFactory mit allen Komplexitäten nicht erstellen, ich war nach einem einfachen Patch auf den vorhandenen Code.
Ich habe das behoben, indem ich die standardmäßige JVM RMI-Socket-Factory, die ist, verantwortlich für das Erstellen dieses Server-Sockets. Es unterstützt jetzt die neue Eigenschaft 'com.sun.management.jmxremote.host'.
Speichern Sie den folgenden Java-Code in einer Datei mit dem Namen sun/rmi/transport/proxy/RMIDirectSocketFactory.java.
Kompilieren und erstellen Sie jmx_patch.jar und legen Sie es in den Tomcat lib/ Ordner.
Anschließend müssen Sie die folgende Zeile in bin/setenv.sh hinzuzufügen:
CLASSPATH = $ CLASSPATH: $ CATALINA_HOME/lib/mx_patch.jar
in tomcat Instanz diese Option hinzufügen, starten
-Dcom.sun.management.jmxremote.host = 192.168.100.100"
Dies wird dann nur die JMX-Dienst binden 192.168.100.100 zu adressieren. das 2 andere Zufall RMI listening-Ports wird immer noch an alle Schnittstellen binden, aber das ist in Ordnung als sie ohnehin immer einen freien Port wählen.
Sie können nun mehr tomcat-Instanzen auf einem einzigen Host mit allen Standard-Ports laufen intakt (zB 8080 für JMX für alle von ihnen).
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);
}
}
Danke - Ich habe nicht gedacht, es wäre einfach oder hübsch. :) –