No he intentado esto pero esto puede ayudar.
la principal molestia aquí es que no hay una manera fácil de especificar la dirección IP del host para el enlace de JMX, siempre se vinculará a todas las interfaces. La propiedad 'java.rmi.server.hostname' no funcionaba y no deseaba elegir puertos diferentes para todas las instancias diferentes en el mismo host.
Además, no quería crear mi propio RMIServerSocketFactory con todas las complejidades asociadas con él, buscaba un parche simple para el código existente.
Lo he arreglado parcheando la fábrica de socket RMI JVM predeterminada que es responsable de crear este socket de servidor. Ahora es compatible con la nueva propiedad 'com.sun.management.jmxremote.host'.
Para que esto funcione, guarde el siguiente código Java en un archivo llamado sun/rmi/transport/proxy/RMIDirectSocketFactory.java.
Compila y crea jmx_patch.jar a partir de él y colócalo en la carpeta tomcat lib/ .
A continuación, deberá añadir la siguiente línea a bin/setenv.sh:
CLASSPATH = $ CLASSPATH: $ CATALINA_HOME/lib/mx_patch.JAR
añadir esta opción en la instancia de Tomcat arranque
-Dcom.sun.management.jmxremote.host = 192.168.100.100"
Esto entonces se unirá al servicio JMX única para hacer frente a 192.168.100.100. los otros 2 puertos de escucha RMI al azar todavía se unirán a todas las interfaces, pero eso está bien , ya que siempre que busque un puerto libre de todos modos.
ahora puede ejecutar varias instancias de Tomcat en un único host con todos los puertos predeterminados intacto (por ejemplo, 8080 para JMX para todos ellos).
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);
}
}
Gracias - No pensé que sería simple o bonito. :) –