tomcat监控需要用到jmx

 

 

本人的目的,只是要知道tomcat的线程数是不是达到峰值。
因为,当请求达到峰值后,客户端连登陆界面都打不开。我只是想监控捕捉这种情况。
查到资料,说可以用jmx,但,确实不懂。找了很多资料。
请帮忙指点,我怎么得到TOMCAT的线程数。
因为以后会把tomcat升级到成weblogic,JMX也可用在weblogic。
我在tomcat只部署一个应用,想在这个应用的上面增加得到线程数的内容。
email:jybbh@163.com
QQ:47171064
 
 

 

#2楼
关于JMX,我还是建议你去看JDK文档,我这里只是稍微的说说。

在JMX里面,
1,所有的MBean(你把他理解为一个JAVA对象得了)都会被用一个javax.management.ObjectName对象与之相关联。
2,我们可以通过javax.management.MBeanServerConnection取得一个连接,这个连接就是我们访问JAVA对象的代理
3,通过2的连接可以调用注册在MBeanServer上的MBean的方法,以及属性取得。

你所需要做的事情有下面几件:
1,需要把你的Tomcat配置为支持JMX
2,需要获得与Tomcat的javax.management.MBeanServerConnection
3,需要知道“本人的目的,只是要知道tomcat的线程数是不是达到峰值”这件事情是有哪个MBean来提供(也就是找准ObjectName)
4, 需要知道“tomcat的线程数”在你找到的MBean中的属性名

首先我说明以下我做以上事情的环境是TOMCAT6.0
下面对以上四件事情分别对应的做法:
1,打开Tomcat 6.0\bin\tomcat6w,然后在“Java”的“Java Options”下面追加
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=8050
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
语句,特别说明以下port不要用已经用过的端口就OK。

2,3,4见以下代码:
Java code
            
package com.test.thread; import javax.management.MBeanAttributeInfo; import javax.management.MBeanInfo; 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 ThreadThreshold { // mbean server connection private static MBeanServerConnection mbsc = null ; /** * @param args */ public static void main(String[] args) { try { String jmxURL = " service:jmx:rmi:///jndi/rmi://localhost:8050/jmxrmi " ; // tomcat jmx url JMXServiceURL serviceURL = new JMXServiceURL(jmxURL); JMXConnector connector = JMXConnectorFactory.connect(serviceURL, null ); mbsc = connector.getMBeanServerConnection(); ObjectName threadObjName = new ObjectName( " Catalina:type=ThreadPool,name=http-8080 " ); // 这里说明一下,端口最好是动态取得 MBeanInfo mbInfo = mbsc.getMBeanInfo(threadObjName); String attrName = " currentThreadCount " ; // tomcat的线程数对应的属性值 MBeanAttributeInfo[] mbAttributes = mbInfo.getAttributes(); System.out.println( " currentThreadCount: " + mbsc.getAttribute(threadObjName, attrName)); } catch (Exception e) { e.printStackTrace(); } } }

这个代码不许要设置CLASSPATH了,有JDK就行(当然应该是1.5版本的哈)。

以上代码是能达到你的需求的,当然还有待你的改进,有问题继续联络。
 

 

#3楼
简单点的实现,参考了http://oss.wxnet.org/mbeans.html

-----------------
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
  pageEncoding="ISO-8859-1"%>
<% %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<%@page import="javax.management.MBeanServerFactory"%>

<%@page import="javax.management.MBeanServer"%>
<%@page import="org.apache.catalina.Connector"%>
<%@page import="javax.management.ObjectName"%>
<%@page import="com.nantian.jmx.mbean.Server"%>

<%@page import="org.apache.commons.modeler.Registry"%>
<%@page import="java.util.Set"%>
<%@page import="javax.management.MBeanInfo"%>
<%@page import="javax.management.MBeanAttributeInfo"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

<%

MBeanServer mBeanServer = null;
mBeanServer = Registry.getRegistry(null, null).getMBeanServer();
for(int j=0;j<mBeanServer.getDomains().length;j++){
System.out.println("###########"+mBeanServer.getDomains()[j]);
}
System.out.println("###########"+mBeanServer.getDefaultDomain());
//Set names = null;
  try {
  ObjectName obn=new ObjectName("ams:type=Connector,port=8880");
  MBeanInfo minfo=mBeanServer.getMBeanInfo(obn);
  MBeanAttributeInfo attrs[]=minfo.getAttributes();
  Object value=null;
  for( int i=0; i< attrs.length; i++ ) {
  if( ! attrs[i].isReadable() ) continue;
  String attName=attrs[i].getName();
  if( attName.indexOf( "=") >=0 ||
  attName.indexOf( ":") >=0 ||
  attName.indexOf( " ") >=0 ) {
  continue;
  }
  try {
  value=mBeanServer.getAttribute(obn, attName);
  } catch( Throwable t) {
  log("Error getting attribute " + obn +
  " " + attName + " " + t.toString());
  continue;
  }
  if( value==null ) continue;
  if( "modelerType".equals( attName)) continue;
  String valueString=value.toString();
  System.out.println("^^^^^^^#######attName:"+attName);
  System.out.println("^^^^^^^#######valueString:"+valueString);
  }
  } catch (Exception e) {
  e.printStackTrace();
   
  }
%>
</body>
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值