我還沒有嘗試過,但這可能有所幫助。
這裏的主要問題是,沒有簡單的方法來指定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/ 文件夾中。
然後,您需要將下面一行添加到斌/ setenv.sh:
CLASSPATH = $ CLASSPATH:$ CATALINA_HOME/lib目錄/ mx_patch。罐子
添加在Tomcat實例此選項啓動
-Dcom.sun.management.jmxremote.host = 192.168.100.100"
這將僅綁定JMX服務來解決192.168.100.100。其他2個 隨機RMI監聽端口仍然會綁定到所有的接口,但這很好 ,因爲他們總是挑一個自由港反正。
現在,您可以與所有的 默認端口一臺主機上運行多個Tomcat實例完好無損(例如8080 for JMX for 他們全部)。
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