Я не пробовал, но это может помочь.
Главной неприятностью здесь было то, что нет простого способа указать адрес IP-адреса хоста IP-адреса для JMX для привязки, он всегда будет привязан ко всем интерфейсам. Свойство «java.rmi.server.hostname» не работает, и я не хотел выбирать различные порты для всех разных экземпляров на одном хосте.
Кроме того, я не хотел создавать свой собственный RMIServerSocketFactory со всеми связанными с ним сложностями , я был после простого исправления существующего кода.
Я исправил это, установив заводскую фабрику сокетов JMM по умолчанию, которая является , ответственным за создание этого серверного сокета. Теперь он поддерживает новое свойство 'com.sun.management.jmxremote.host'.
Чтобы заставить это работать, сохраните Java-код ниже в файле с именем sun/rmi/transport/proxy/RMIDirectSocketFactory.java.
Скомпилируйте и создайте jmx_patch.jar из него и поместите его в папку tomcat lib/ .
Затем нужно добавить следующую строку в бен/setenv.sh:
CLASSPATH = $ CLASSPATH: $ CATALINA_HOME/Библиотека/mx_patch.баночка
добавить эту опцию в TOMCAT случае запуска
-Dcom.sun.management.jmxremote.host = 192.168.100.100"
Это будет связать службу JMX только в адрес 192.168.100.100. в 2 других случайных RMI слушающих порты будут по-прежнему связывается со всеми интерфейсами, но это хорошо как они всегда выбирают свободный порт в любом случае.
Теперь вы можете запускать несколько экземпляров Tomcat на одном хосте со всеми портов по умолчанию неповрежденный (например, 8080 для JMX для все они).
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);
}
}
Спасибо - я не думал, что это будет просто или красиво. :) – 2008-12-02 06:53:09