我没有尝试过这个,但这可能会有所帮助。
主要的问题在于没有简单的方法来指定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/文件夹中。
然后,您需要将以下行添加到bin/setenv.sh中:
CLASSPATH=$CLASSPATH:$CATALINA_HOME/lib/mx_patch.jar
添加此选项到Tomcat实例启动。
-Dcom.sun.management.jmxremote.host=192.168.100.100"
这将仅将JMX服务绑定到地址192.168.100.100。另外2个随机的RMI监听端口仍将绑定到所有接口,但这没关系,因为它们总是选择一个空闲端口。
现在,您可以在单个主机上运行多个Tomcat实例,并保留所有默认端口(例如,对于所有Tomcat实例的JMX为8080)。
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");
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);
}
}
-Dcom.sun.management.jmxremote.ssl=false
禁用SSL,否则-Dcom.sun.management.jmxremote.host=127.0.0.1
将被忽略。 - RubenLaguna