Tôi chưa thử điều này nhưng điều này có thể hữu ích.
mối phiền toái chính ở đây là không có cách nào dễ dàng để chỉ định địa chỉ IP của máy chủ để liên kết với, nó sẽ luôn ràng buộc với tất cả các giao diện. Thuộc tính 'java.rmi.server.hostname' không hoạt động và tôi không muốn chọn các cổng khác nhau cho tất cả các phiên bản khác nhau trên cùng một máy chủ.
Ngoài ra, tôi không muốn tạo RMIServerSocketFactory của riêng mình với tất cả các sự phức tạp liên quan đến nó, tôi đã sau một bản vá đơn giản cho mã hiện có.
Tôi đã sửa lỗi này bằng cách vá nhà máy socket JVM RMI mặc định là chịu trách nhiệm tạo ổ cắm máy chủ này. Hiện tại, nó hỗ trợ thuộc tính mới 'com.sun.management.jmxremote.host'.
Để làm điều này hoạt động, hãy lưu mã Java bên dưới vào một tệp có tên mặt trời/rmi/transport/proxy/RMIDirectSocketFactory.java.
Biên dịch và tạo jmx_patch.jar từ nó và đặt nó vào thư mục lib/ tomcat.
Sau đó, bạn cần phải thêm dòng sau vào bin/setenv.sh:
CLASSPATH = $ CLASSPATH: $ CATALINA_HOME/lib/mx_patch.jar
thêm tùy chọn này trong trường hợp tomcat khởi động
-Dcom.sun.management.jmxremote.host = 192.168.100.100"
này sau đó sẽ ràng buộc các dịch vụ JMX chỉ để giải quyết 192.168.100.100. 2 khác ngẫu nhiên RMI nghe cổng vẫn sẽ liên kết với tất cả các giao diện, nhưng điều đó là tốt như họ luôn chọn một cảng tự do anyway.
Bây giờ bạn có thể chạy nhiều trường hợp tomcat trên một máy chủ duy nhất với tất cả các cổng mặc định nguyên vẹn (ví dụ: 8080 cho JMX cho Tất cả bọn họ).
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);
}
}
Cảm ơn - Tôi không nghĩ nó sẽ đơn giản hay đẹp. :) –