tomcat監控需要用到jmx

 

 

本人的目的,只是要知道tomcat的線程數是不是達到峯值。
因爲,當請求達到峯值後,客戶端連登陸界面都打不開。我只是想監控捕捉這種情況。
查到資料,說可以用jmx,但,確實不懂。找了很多資料。
請幫忙指點,我怎麼得到TOMCAT的線程數。
因爲以後會把tomcat升級到成weblogic,JMX也可用在weblogic。
我在tomcat只部署一個應用,想在這個應用的上面增加得到線程數的內容。
email:[email protected]
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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章