您的位置:首页技术文章
文章详情页

使用JMX监控Tomcat示例代码

【字号: 日期:2023-06-12 15:17:15浏览:127作者:猪猪
目录
  • 示例代码
  • 完整的示例代码文件

示例代码

String jmxURL = "service:jmx:rmi:///jndi/rmi://192.168.10.93:8999/jmxrmi";
JMXServiceURL serviceURL = new JMXServiceURL(jmxURL);

Map map = new HashMap();
// 用户名密码,在jmxremote.password文件中查看
String[] credentials = new String[] { "monitorRole", "tomcat" };
map.put("jmx.remote.credentials", credentials);
JMXConnector connector = JMXConnectorFactory.connect(serviceURL, map);
MBeanServerConnection mbsc = connector.getMBeanServerConnection();

// 端口最好是动态取得
ObjectName threadObjName = new ObjectName("Catalina:type=ThreadPool,name=http-8080");
MBeanInfo mbInfo = mbsc.getMBeanInfo(threadObjName);

// tomcat的线程数对应的属性值
String attrName = "currentThreadCount";
MBeanAttributeInfo[] mbAttributes = mbInfo.getAttributes();
System.out.println("currentThreadCount:" + mbsc.getAttribute(threadObjName, attrName));

完整的示例代码文件

import java.lang.management.MemoryUsage;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Formatter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import javax.management.MBeanAttributeInfo;
import javax.management.MBeanInfo;
import javax.management.MBeanServerConnection;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.management.openmbean.CompositeDataSupport;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
/**
 * @author liuyazhuang
 * @date 2016-05-31 
 */
public class JMXTest {

    /**
     * main方法
     * @param args
     */
    public static void main(String[] args) {
try {

    String jmxURL = "service:jmx:rmi:///jndi/rmi://127.0.0.1:8999/jmxrmi";

    JMXServiceURL serviceURL = new JMXServiceURL(jmxURL);

    Map map = new HashMap();
    String[] credentials = new String[] { "monitorRole", "tomcat" };
    map.put("jmx.remote.credentials", credentials);
    JMXConnector connector = JMXConnectorFactory.connect(serviceURL,
    map);
    MBeanServerConnection 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));

    // heap
    for (int j = 0; j < mbsc.getDomains().length; j++) {
System.out.println("###########" + mbsc.getDomains()[j]);
    }
    Set MBeanset = mbsc.queryMBeans(null, null);
    System.out.println("MBeanset.size() : " + MBeanset.size());
    Iterator MBeansetIterator = MBeanset.iterator();
    while (MBeansetIterator.hasNext()) {
ObjectInstance objectInstance = (ObjectInstance) MBeansetIterator
.next();
ObjectName objectName = objectInstance.getObjectName();
String canonicalName = objectName.getCanonicalName();
System.out.println("canonicalName : " + canonicalName);
if (canonicalName
.equals("Catalina:host=localhost,type=Cluster")) {
    // Get details of cluster MBeans
    System.out.println("Cluster MBeans Details:");
    System.out
    .println("=========================================");
    // getMBeansDetails(canonicalName);
    String canonicalKeyPropList = objectName
    .getCanonicalKeyPropertyListString();
}
    }
    // ------------------------- system ----------------------
    ObjectName runtimeObjName = new ObjectName("java.lang:type=Runtime");
    System.out.println("厂商:"
    + (String) mbsc.getAttribute(runtimeObjName, "VmVendor"));
    System.out.println("程序:"
    + (String) mbsc.getAttribute(runtimeObjName, "VmName"));
    System.out.println("版本:"
    + (String) mbsc.getAttribute(runtimeObjName, "VmVersion"));
    Date starttime = new Date((Long) mbsc.getAttribute(runtimeObjName,
    "StartTime"));
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    System.out.println("启动时间:" + df.format(starttime));

    Long timespan = (Long) mbsc.getAttribute(runtimeObjName, "Uptime");
    System.out.println("连续工作时间:" + JMXTest.formatTimeSpan(timespan));
    // ------------------------ JVM -------------------------
    // 堆使用率
    ObjectName heapObjName = new ObjectName("java.lang:type=Memory");
    MemoryUsage heapMemoryUsage = MemoryUsage
    .from((CompositeDataSupport) mbsc.getAttribute(heapObjName,
    "HeapMemoryUsage"));
    long maxMemory = heapMemoryUsage.getMax();// 堆最大
    long commitMemory = heapMemoryUsage.getCommitted();// 堆当前分配
    long usedMemory = heapMemoryUsage.getUsed();
    System.out.println("heap:" + (double) usedMemory * 100
    / commitMemory + "%");// 堆使用率

    MemoryUsage nonheapMemoryUsage = MemoryUsage
    .from((CompositeDataSupport) mbsc.getAttribute(heapObjName,
    "NonHeapMemoryUsage"));
    long noncommitMemory = nonheapMemoryUsage.getCommitted();
    long nonusedMemory = heapMemoryUsage.getUsed();
    System.out.println("nonheap:" + (double) nonusedMemory * 100
    / noncommitMemory + "%");

    ObjectName permObjName = new ObjectName(
    "java.lang:type=MemoryPool,name=Perm Gen");
    MemoryUsage permGenUsage = MemoryUsage
    .from((CompositeDataSupport) mbsc.getAttribute(permObjName,
    "Usage"));
    long committed = permGenUsage.getCommitted();// 持久堆大小
    long used = heapMemoryUsage.getUsed();//
    System.out.println("perm gen:" + (double) used * 100 / committed
    + "%");// 持久堆使用率

    // -------------------- Session ---------------
    ObjectName managerObjName = new ObjectName(
    "Catalina:type=Manager,*");
    Set<ObjectName> s = mbsc.queryNames(managerObjName, null);
    for (ObjectName obj : s) {
System.out.println("应用名:" + obj.getKeyProperty("path"));
ObjectName objname = new ObjectName(obj.getCanonicalName());
System.out.println("最大会话数:"
+ mbsc.getAttribute(objname, "maxActiveSessions"));
System.out.println("会话数:"
+ mbsc.getAttribute(objname, "activeSessions"));
System.out.println("活动会话数:"
+ mbsc.getAttribute(objname, "sessionCounter"));
    }

    // ----------------- Thread Pool ----------------
    ObjectName threadpoolObjName = new ObjectName(
    "Catalina:type=ThreadPool,*");
    Set<ObjectName> s2 = mbsc.queryNames(threadpoolObjName, null);
    for (ObjectName obj : s2) {
System.out.println("端口名:" + obj.getKeyProperty("name"));
ObjectName objname = new ObjectName(obj.getCanonicalName());
System.out.println("最大线程数:"
+ mbsc.getAttribute(objname, "maxThreads"));
System.out.println("当前线程数:"
+ mbsc.getAttribute(objname, "currentThreadCount"));
System.out.println("繁忙线程数:"
+ mbsc.getAttribute(objname, "currentThreadsBusy"));
    }

} catch (Exception e) {
    e.printStackTrace();
}
    }

    public static String formatTimeSpan(long span) {
long minseconds = span % 1000;

span = span / 1000;
long seconds = span % 60;

span = span / 60;
long mins = span % 60;

span = span / 60;
long hours = span % 24;

span = span / 24;
long days = span;
return (new Formatter()).format("%1$d天 %2$02d:%3$02d:%4$02d.%5$03d",
days, hours, mins, seconds, minseconds).toString();
    }
}

到此这篇关于使用JMX监控Tomcat示例代码的文章就介绍到这了,更多相关JMX监控Tomcat内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

标签: Tomcat
相关文章: