使用Java代码访问Tomcat监视器

时间:2014-05-14 06:37:21

标签: java jmx

我是JMX的新手。我试图记录tomcat统计信息,如使用的线程,缓存,会话和其他标准值。我试图用java代码实现这一点。

到目前为止,我已做了以下事情。 (我试图在Windows上访问本地tomcat 6.0监视器的值)

1)我在catalina.bat中添加了以下选项 设置CATALINA_OPTS = -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port = 9004 -Dcom.sun.management.jmxremote.ssl = false -Dcom.sun.management.jmxremote.authenticate = false

之后我重新启动了tomcat服务器。

2)然后我写了下面的代码。

package com.ss.fg;

import java.lang.management.ManagementFactory;
import javax.management.MBeanServer;
import javax.management.ObjectName;

public class SystemConfigManagement
{
    static MBeanServer connection = ManagementFactory.getPlatformMBeanServer();
    public static void main(String[] args) throws Exception {
        getActiveSession();    
    }  
    public static void getActiveSession()throws Exception
    {
        ObjectName name=new ObjectName("Catalina:type=Manager,path=/MMDisplay,host=localhost");
        String attrValue = ManagementFactory.getPlatformMBeanServer().getAttribute(name, "activeSessions").toString();
        System.out.println(attrValue);

    }
}

我甚至尝试过上下文而不是路径。

我收到以下异常

Exception in thread "main" javax.management.InstanceNotFoundException: Catalina:type=Manager,path=/MMDisplay,host=localhost
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getMBean(Unknown Source)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getAttribute(Unknown Source)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.getAttribute(Unknown Source)
    at com.softsmith.floodgates.SystemConfigManagement.getActiveSession(SystemConfigManagement.java:15)
    at com.softsmith.floodgates.SystemConfigManagement.main(SystemConfigManagement.java:10)

如何解决此问题?

我应该添加一些jar文件,还是应该做一些其他设置..

请帮忙

2 个答案:

答案 0 :(得分:1)

使用时

 MBeanServer connection = ManagementFactory.getPlatformMBeanServer();

您实际上是连接到运行程序的JVM的MBean-Server,而不是tomcat-instance的MBean-Server,所以它不知道Catalina-MBeans。

要建立与远程jvm的连接,请尝试以下方法:

JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://servername:9999/jmxrmi");
JMXConnector connector = JMXConnectorFactory.connect(url);
connector.connect();
MBeanServerConnection server = connector.getMBeanServerConnection();
//do work here
ObjectName name = new ObjectName("Catalina:type=Manager,path=/manager,host=localhost");
String attrValue = mb.getAttribute(name, "activeSessions").toString();
System.out.println(attrValue);
//..and don't forget to close the connection
connector.close();

如果错误仍然存​​在,请确保使用正确的对象名称。

答案 1 :(得分:1)

当我使用

 MBeanServer connection = ManagementFactory.getPlatformMBeanServer();

我实际上是连接到运行我的程序的JVM的MBean-Server,而不是我的tomcat-instance的MBean-Server,因此它不知道Catalina-MBeans。 所以我尝试将远程连接到jmx,但是有这样的错误:

java.io.IOException: Failed to retrieve RMIServer stub: javax.naming.CommunicationException [Root exception is java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is....

现在我解决了:

首先我将catalina-jmx-remote.jar添加到Tomcat的TOMCAT_HOME/lib目录,然后在server.xml上配置监听器我添加了以下内容 标签下的片段:

<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="10001" rmiServerPortPlatform="10002" useLocalPorts="true" />

最后我在catalina.bat中设置了以下句子:

JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=localhost -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"