Java 无法连接到远程JMX

Java 无法连接到远程JMX,java,jconsole,Java,Jconsole,我在远程主机上有一个tomcat应用程序,需要通过JConsole连接它。应用程序以参数开始: IP=`ifconfig eth0 | grep 'inet addr:' | cut -d ':' -f2 | cut -d ' ' -f1` -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=$IP -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxr

我在远程主机上有一个tomcat应用程序,需要通过JConsole连接它。应用程序以参数开始:

IP=`ifconfig eth0 | grep 'inet addr:' | cut -d ':' -f2 | cut -d ' ' -f1`

-Dcom.sun.management.jmxremote
-Djava.rmi.server.hostname=$IP
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false

端口9999已打开,
IP
值有效,我检查了它。我可以通过telnet(
telnet
)访问它。Netstat:

netstat -a | grep LISTEN
tcp        0      0 *:9999                  *:*                     LISTEN 
但我无法通过jconsole连接它,我总是会遇到相同的错误:

Connection Failed: Retry?
但是
netstat-a
显示连接已建立

我尝试了不同的地址:

<my_host>:<my_port>

service:jmx:rmi://<my_host>:<my_port>/jndi/rmi://<my_host>:<my_port>/jmxrmi

service:jmx:rmi:///jndi/rmi://<my_host>:<my_port>/jmxrmi
:
服务:jmx:rmi://:/jndi/rmi://:/jmxrmi
服务:jmx:rmi:///jndi/rmi://:/jmxrmi
我还尝试添加文件
../conf/remote.users
../remote.acl
,并在prorerities
-Dcom.sun.management.jmxremote.password.file
-Dcom.sun.management.jmxremote.access.file
中写入这些文件的路径,但没有效果

当我在本地计算机上部署此应用程序时,我可以通过
“localhost:9999”


帮助某人,有什么问题吗?

如果您能够
telnet
那么问题一定是因为防火墙,因为在JMX中,一旦在配置的端口上进行握手,即分配一个新端口用于进一步通信,可能您的防火墙不允许打开新端口

要进行交叉检查,只需尝试在Java JMX客户机下面运行,该客户机将尝试显示HeapMemoryUsage

import java.util.Set;

import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

public class JMXDemo {

    private static final String HOST = ""; // configure host <my_host> here
    private static final String PORT = ""; // configure port <my_port> here

    private static void testJMX() throws Exception {
        JMXServiceURL url = new JMXServiceURL("service:jmx:rmi://" + HOST + "/jndi/rmi://" + HOST + ":" + PORT
                + "/jmxrmi");

        JMXConnector jmxConnector = JMXConnectorFactory.connect(url);
        try {
            MBeanServerConnection mbeanServerConnection = jmxConnector.getMBeanServerConnection();

            ObjectName mbeanName = new ObjectName("java.lang:type=Memory");
            javax.management.openmbean.CompositeDataSupport obj = null;

            obj = (javax.management.openmbean.CompositeDataSupport) mbeanServerConnection.getAttribute(mbeanName,
                    "HeapMemoryUsage");
            Set<String> keySet = obj.getCompositeType().keySet();

            for (String key : keySet) {
                System.out.print(key + "=" + obj.get(key) + ", ");
            }
        } finally {
            jmxConnector.close();
        }
        System.out.println("\n==========================");
    }

    public static void main(String args[]) throws Exception {
        testJMX();
    }

}
编译java代码并使用以下命令运行

 java -Djava.util.logging.config.file=./logging.properties JMXDemo 
这将在控制台上打印大量日志,您可以grep“port”。

尝试所有这些标志:


如果Dcom.sun.management.jmxremote.local.only为true,它将阻止远程连接。

编写一个基本Java程序:

import java.util.*;
import java.io.*;

class testCode{
  public static void main(String args[]){
    System.out.println("just killing time...do not enter a value and kill me ");
    Scanner sc = new Scanner(System.in);
    sc.nextInt();
  }    
}
使用以下参数编译并运行它:

java -Dcom.sun.management.jmxremote=true \
 -Dcom.sun.management.jmxremote.port=12345 \
 -Dcom.sun.management.jmxremote.authenticate=false \
 -Dcom.sun.management.jmxremote.ssl=false \
 -Djava.rmi.server.hostname=10.1.10.167 \
 testCode

用执行Java代码的机器的IP替换
rmi.server.hostname
,然后使用
jconsole
远程连接
10.1.10.167:12345
。不需要用户id和密码。

首先使用命令
telnet
检查连接,如果无法连接,请检查这两台计算机之间的防火墙设置。同时在IP=
ifconfig eth0 | grep'inet addr:'| cut-d':'-f2 | cut-d'-f1
之后回显IP
echo$IP
,以验证有效的IP值。
IP
值有效,我检查了它,telnet运行良好。请检查您使用的
$IP
是否在机器的
/etc/hosts
中以某种方式转换为内部环回地址?否,
/etc/hosts
不包含
它在
JMXConnector JMXConnector=JMXConnectorFactory.connect(url)中被阻止JMXConnector JMXConnector=JMXConnectorFactory.connect(url);在线程“main”java.rmi.ConnectException中引发:
异常:拒绝连接到主机:192.168.123.32;嵌套异常是:
java.net.ConnectException:Connection timed out
如何找到此新端口的编号?我正在尝试此操作。为此,我们还必须进行TCP日志记录。你是对的!这是防火墙。这是一台测试机,我可以把它关掉。非常感谢!我有多个网络,此选项解决了我的问题:-Djava.rmi.server.hostname。
import java.util.*;
import java.io.*;

class testCode{
  public static void main(String args[]){
    System.out.println("just killing time...do not enter a value and kill me ");
    Scanner sc = new Scanner(System.in);
    sc.nextInt();
  }    
}
java -Dcom.sun.management.jmxremote=true \
 -Dcom.sun.management.jmxremote.port=12345 \
 -Dcom.sun.management.jmxremote.authenticate=false \
 -Dcom.sun.management.jmxremote.ssl=false \
 -Djava.rmi.server.hostname=10.1.10.167 \
 testCode