代码之家  ›  专栏  ›  技术社区  ›  Marc Novakowski

如何让JMX绑定到特定接口?

  •  19
  • Marc Novakowski  · 技术社区  · 16 年前

    com.sun.management.jmxremote.* 属性,以便我可以通过JConsole连接到它进行管理和监视。不幸的是,它侦听机器上的所有接口(IP地址)。

    在我们的环境中,经常会有多个Java VM同时在一台机器上运行的情况。虽然可以告诉JMX在不同的TCP端口上侦听(使用 com.sun.management.jmxremote.port

    5 回复  |  直到 16 年前
        1
  •  31
  •   GaÅ¡per    8 年前

    -Dcom.sun.management.jmxremote.host 绑定到选定的IP

    见: https://bugs.openjdk.java.net/browse/JDK-6425769

        2
  •  8
  •   tcurdt    16 年前

    费尔南多已经提供了一个链接 my blog post :)…这不是小事。您必须提供自己的RMIServerSocketFactoryImpl,用于在所需地址上创建套接字。

        3
  •  0
  •   Niranjan    8 年前

    我还没试过,但这可能会有帮助。

    JMX要绑定到的地址,它将始终绑定到所有接口。这个 “java.rmi.server.hostname”属性不起作用,我不想选择它 同一主机上所有不同实例的不同端口。

    另外,我不想用所有的资源创建自己的RMIServerSocketFactory

    要使其工作,请将下面的Java代码保存到名为

    然后需要将以下行添加到bin/setenv.sh:

    CLASSPATH=$CLASSPATH:$CATALINA_HOME/lib/mx_patch.jar

    在tomcat实例启动中添加此选项

    然后,这将仅将JMX服务绑定到地址192.168.100.100。另外两个 随机RMI侦听端口仍将绑定到所有接口,但这很好 因为他们总是选择自由港。

    现在,您可以在一台主机上运行多个tomcat实例,并使用所有

    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);
      }
    

        4
  •  0
  •   Ivan    3 年前

    正当使用 com.sun.management.jmxremote.host 不变 com.sun.management.jmxremote.ssl (默认为 true com.sun.management.jmxremote.registry.ssl false com.sun.management.jmxremote.port com.sun.management.jmxremote.host com.sun.management.jmxremote.rmi.port jmxremote.ssl jmxremote.registry.ssl jmxremote.host

      -Dcom.sun.management.jmxremote.authenticate=false
      -Dcom.sun.management.jmxremote.port=1234
      -Dcom.sun.management.jmxremote.host=interface1
      
    

    它仍将绑定到端口的所有接口 1234 interface1 jmxremote.rmi.port

    jmxremote.port jmxremote.port

        5
  •  -2
  •   Roy Sigurd Karlsbakk    8 年前

        6
  •  -3
  •   sosiouxme    10 年前

    -Djava.rmi.server.hostname=<YOUR_IP>
    

    -Dcom.sun.management.jmxremote.host=<YOUR_IP>
    

    应该 简单一点。