使用Java代码访问Tomcat监视器

3
我很新于JMX,我试图记录像使用的线程数、缓存、会话和其他标准值等Tomcat统计信息。我正在尝试使用Java代码实现这一点。目前为止,我已经完成了以下事情(我正在尝试访问Windows上本地Tomcat 6.0监视器的值):
1)我已经在catalina.bat中添加了以下选项: set 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);

    }
}

我甚至尝试了上下文(context)而不是路径(path)。
我得到以下异常。
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文件,还是需要进行其他设置...

请帮忙。


我遇到了这样的错误:Exception in thread "main" javax.management.InstanceNotFoundException: Catalina:type=Manager,path=/,host=localhost - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
2个回答

1
使用时
 MBeanServer connection = ManagementFactory.getPlatformMBeanServer();

你实际上连接的是运行程序的JVM的MBean服务器,而不是你的Tomcat实例的MBean服务器,因此它不知道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();

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

好的,谢谢。但是使用您的代码我无法连接(远程)到JMX:JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://192.168.40.20(Tomcat服务器IP):9090(Tomcat端口)/jmxrmi"); - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
这是我的错误: java.io.IOException: 无法检索RMIServer存根:javax.naming.CommunicationException [根异常是java.rmi.ConnectIOException:JRMP连接建立期间发生错误;嵌套异常是....。我在Eclipse的VM参数中添加了以下选项: -Djava.rmi.server.hostname=127.0.0.1 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Tomcat中的哪个端口用于哪种类型的连接?有一个处理HTTP请求的端口和一个处理JMX的端口 - 它们不能相同! - piet.t
Tomcat用于HTTP请求的端口是:9090,而JMX的端口是:1099。我添加了:com.sun.management.jmxremote.port=1099, 并且这是我的JMXServiceURL: "service:jmx:rmi:///jndi/rmi://192.168.40.70:1099/jmxrmi" - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
我又遇到了这个错误: Exception in thread "main" java.io.IOException: Failed to retrieve RMIServer stub: javax.naming.ServiceUnavailableException [Root exception is java.rmi.ConnectException: Connection refused to host: 192.168.40.70; nested exception is: java.net.ConnectException: Connection refused: connect] - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
显示剩余3条评论

1
当我在使用时。
 MBeanServer connection = ManagementFactory.getPlatformMBeanServer();

我实际上是连接到运行我的程序的JVM的MBean服务器,而不是连接到我的Tomcat实例的MBean服务器,因此它不知道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 上配置监听器,我在 <Server> 标签下添加了以下代码片段:

<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"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接