无法连接到远程JMX

时间:2016-03-14 08:46:12

标签: java jconsole

我在远程主机上有一个tomcat应用程序,需要通过JConsole连接它。申请从params开始:

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 <my_host> <my_port>)访问它。 netstat的:

netstat -a | grep LISTEN
tcp        0      0 *:9999                  *:*                     LISTEN 

但是我无法通过jconsole连接它,我总是得到同样的错误:

Connection Failed: Retry?

但是netstat -a表明连接是ESTABLISHED

我尝试了不同的地址:

<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

我还尝试添加文件.../conf/remote.users.../remote.acl,并在prorerties -Dcom.sun.management.jmxremote.password.file-Dcom.sun.management.jmxremote.access.file中为这些文件写入pathes,但它没有效果。

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

连接到该应用程序

帮助某人,可能是什么问题?

3 个答案:

答案 0 :(得分:5)

如果你能够telnet <my_host> <my_port>那么问题必须是因为防火墙,因为在JMX中一旦在配置端口上完成握手,即然后分配了一个新端口用于进一步通信,可能你的Firwall不允许打开新港口。

要交叉检查,只需尝试在Java JMX Client下运行,它将尝试显示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();
    }

}

启用JMX日志记录 创建logging.properties文件

handlers= java.util.logging.ConsoleHandler
.level=ALL

java.util.logging.FileHandler.pattern = jmx.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter

java.util.logging.ConsoleHandler.level = FINEST
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

// Use FINER or FINEST for javax.management.remote.level - FINEST is
// very verbose...
//
javax.management.level=FINEST
javax.management.remote.level=FINEST

java.security.debug=all

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

 java -Djava.util.logging.config.file=./logging.properties JMXDemo 

这将在控制台上打印如此多的日志,你可以grep&#34; port&#34;。

答案 1 :(得分:2)

编写基本的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

rmi.server.hostname替换为正在执行Java代码的计算机的IP,然后使用jconsole10.1.10.167:12345进行远程连接。无需用户ID和密码。

答案 2 :(得分:1)

尝试所有这些标志:

dir /b /s /a-d "%%a:\gm_construct.bsp" set p=%%~dpnxa

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