我没有尝试过,但这可能会有所帮助。
这里的主要麻烦是没有简单的方法来指定 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 实例,并且所有默认端口都完好无损(例如,所有这些端口的 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");
// 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);
}
}