我是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文件,还是应该做一些其他设置..
请帮忙
答案 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"