Je n'ai pas essayé ceci mais ceci peut aider.
la principale nuisance ici était qu'il n'y a pas de moyen facile de spécifier l'adresse IP hôte pour JMX à lier à, il se lierait toujours à toutes les interfaces. La propriété 'java.rmi.server.hostname' ne fonctionnait pas et je ne voulais pas choisir différents ports pour toutes les instances différentes sur le même hôte.
En outre, je ne voulais pas créer ma propre RMIServerSocketFactory avec toutes les complexités qui lui sont associés, j'étais après un simple patch au code existant.
J'ai résolu ce problème en corrigeant l'usine de socket JVM RMI par défaut qui est responsable de la création de cette socket serveur. Il prend désormais en charge la nouvelle propriété 'com.sun.management.jmxremote.host' . Enregistrez le code Java ci-dessous dans un fichier nommé sun/rmi/transport/proxy/RMIDirectSocketFactory.java pour que cela fonctionne.
Compilez et créez-y jmx_patch.jar et placez-le dans le dossier tomcat lib/ .
Vous devez alors ajouter la ligne suivante à bin/setenv.sh:
CLASSPATH = $ CLASSPATH: $ CATALINA_HOME/lib/mx_patch.Pot
ajouter cette option dans l'instance tomcat démarrage
-Dcom.sun.management.jmxremote.host = 192.168.100.100"
Cela lie alors le service JMX que pour répondre 192.168.100.100. les 2 autres aléatoires ports d'écoute RMI toujours se lier à toutes les interfaces, mais qui est bien comme toujours choisir un port libre de toute façon.
Vous pouvez maintenant exécuter plusieurs instances de tomcat sur un seul hôte avec tous les ports par défaut intact (par exemple 8080 pour JMX pour tous).
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);
}
}
Merci - je ne pensais pas que ce serait simple ou joli. :) –