我还没有尝试过,但这可能有所帮助。
这里的主要问题是,没有简单的方法来指定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