JMX连接Mbean获取Tomcat信息

JMX实现远程服务器Tomcat系统监控之一 JMX实现远程服务器端的包括CPU占用率,堆信息,非堆信息,类加载,内存使用情况等统计。 阅读详情
 JMX连接Mbean获取Tomcat信息

最近用JAVA写了个获取tomcat信息资源的代码,随便保存一下。

大致的步骤全在这了,可以获取到任何想要的指标:

 

  1. import java.lang.management.MemoryUsage; 
  2. import java.text.SimpleDateFormat; 
  3. import java.util.Date; 
  4. import java.util.Formatter; 
  5. import java.util.HashMap; 
  6. import java.util.Iterator; 
  7. import java.util.Map; 
  8. import java.util.Set; 
  9.  
  10. import javax.management.MBeanAttributeInfo; 
  11. import javax.management.MBeanInfo; 
  12. import javax.management.MBeanServerConnection; 
  13. import javax.management.ObjectInstance; 
  14. import javax.management.ObjectName; 
  15. import javax.management.openmbean.CompositeDataSupport; 
  16. import javax.management.remote.JMXConnector; 
  17. import javax.management.remote.JMXConnectorFactory; 
  18. import javax.management.remote.JMXServiceURL; 
  19.  
  20. public class test { 
  21.     /** 
  22.      * @param args 
  23.      */ 
  24.     public static void main(String[] args) { 
  25.         try { 
  26.  
  27.             String jmxURL = "service:jmx:rmi:///jndi/rmi://192.168.1.126:10090/jmxrmi";//tomcat jmx url   
  28.             JMXServiceURL serviceURL = new JMXServiceURL(jmxURL); 
  29.  
  30.             Map map = new HashMap(); 
  31.             String[] credentials = new String[] { "monitorRole""QED" }; 
  32.             map.put("jmx.remote.credentials", credentials); 
  33.             JMXConnector connector = JMXConnectorFactory.connect(serviceURL, map); 
  34.             MBeanServerConnection mbsc = connector.getMBeanServerConnection(); 
  35.  
  36.             //端口最好是动态取得   
  37.             ObjectName threadObjName = new ObjectName("Catalina:type=ThreadPool,name=http-8089"); 
  38.             MBeanInfo mbInfo = mbsc.getMBeanInfo(threadObjName); 
  39.  
  40.             String attrName = "currentThreadCount";//tomcat的线程数对应的属性值   
  41.             MBeanAttributeInfo[] mbAttributes = mbInfo.getAttributes(); 
  42.             System.out.println("currentThreadCount:" + mbsc.getAttribute(threadObjName, attrName)); 
  43.  
  44.             //heap   
  45.             for (int j = 0; j < mbsc.getDomains().length; j++) { 
  46.                 System.out.println("###########" + mbsc.getDomains()[j]); 
  47.             } 
  48.             Set MBeanset = mbsc.queryMBeans(nullnull); 
  49.             System.out.println("MBeanset.size() : " + MBeanset.size()); 
  50.             Iterator MBeansetIterator = MBeanset.iterator(); 
  51.             while (MBeansetIterator.hasNext()) { 
  52.                 ObjectInstance objectInstance = (ObjectInstance) MBeansetIterator.next(); 
  53.                 ObjectName objectName = objectInstance.getObjectName(); 
  54.                 String canonicalName = objectName.getCanonicalName(); 
  55.                 System.out.println("canonicalName : " + canonicalName); 
  56.                 if (canonicalName.equals("Catalina:host=localhost,type=Cluster")) { 
  57.                     // Get details of cluster MBeans   
  58.                     System.out.println("Cluster MBeans Details:"); 
  59.                     System.out.println("========================================="); 
  60.                     //getMBeansDetails(canonicalName);   
  61.                     String canonicalKeyPropList = objectName.getCanonicalKeyPropertyListString(); 
  62.                 } 
  63.             } 
  64.             //------------------------- system ----------------------   
  65.             ObjectName runtimeObjName = new ObjectName("java.lang:type=Runtime"); 
  66.             System.out.println("厂商:" + (String) mbsc.getAttribute(runtimeObjName, "VmVendor")); 
  67.             System.out.println("程序:" + (String) mbsc.getAttribute(runtimeObjName, "VmName")); 
  68.             System.out.println("版本:" + (String) mbsc.getAttribute(runtimeObjName, "VmVersion")); 
  69.             Date starttime = new Date((Long) mbsc.getAttribute(runtimeObjName, "StartTime")); 
  70.             SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
  71.             System.out.println("启动时间:" + df.format(starttime)); 
  72.  
  73.             Long timespan = (Long) mbsc.getAttribute(runtimeObjName, "Uptime"); 
  74.             System.out.println("连续工作时间:" + test.formatTimeSpan(timespan)); 
  75.             //------------------------ JVM -------------------------   
  76.             //堆使用率   
  77.             ObjectName heapObjName = new ObjectName("java.lang:type=Memory"); 
  78.             MemoryUsage heapMemoryUsage = MemoryUsage.from((CompositeDataSupport) mbsc.getAttribute(heapObjName, 
  79.                     "HeapMemoryUsage")); 
  80.             long maxMemory = heapMemoryUsage.getMax();//堆最大   
  81.             long commitMemory = heapMemoryUsage.getCommitted();//堆当前分配   
  82.             long usedMemory = heapMemoryUsage.getUsed(); 
  83.             System.out.println("heap:" + (double) usedMemory * 100 / commitMemory + "%");//堆使用率   
  84.  
  85.             MemoryUsage nonheapMemoryUsage = MemoryUsage.from((CompositeDataSupport) mbsc.getAttribute(heapObjName, 
  86.                     "NonHeapMemoryUsage")); 
  87.             long noncommitMemory = nonheapMemoryUsage.getCommitted(); 
  88.             long nonusedMemory = heapMemoryUsage.getUsed(); 
  89.             System.out.println("nonheap:" + (double) nonusedMemory * 100 / noncommitMemory + "%"); 
  90.  
  91.             ObjectName permObjName = new ObjectName("java.lang:type=MemoryPool,name=Perm Gen"); 
  92.             MemoryUsage permGenUsage = MemoryUsage.from((CompositeDataSupport) mbsc.getAttribute(permObjName, "Usage")); 
  93.             long committed = permGenUsage.getCommitted();//持久堆大小   
  94.             long used = heapMemoryUsage.getUsed();//   
  95.             System.out.println("perm gen:" + (double) used * 100 / committed + "%");//持久堆使用率   
  96.  
  97.             //-------------------- Session ---------------    
  98.             ObjectName managerObjName = new ObjectName("Catalina:type=Manager,*"); 
  99.             Set<ObjectName> s = mbsc.queryNames(managerObjName, null); 
  100.             for (ObjectName obj : s) { 
  101.                 System.out.println("应用名:" + obj.getKeyProperty("path")); 
  102.                 ObjectName objname = new ObjectName(obj.getCanonicalName()); 
  103.                 System.out.println("最大会话数:" + mbsc.getAttribute(objname, "maxActiveSessions")); 
  104.                 System.out.println("会话数:" + mbsc.getAttribute(objname, "activeSessions")); 
  105.                 System.out.println("活动会话数:" + mbsc.getAttribute(objname, "sessionCounter")); 
  106.             } 
  107.  
  108.             //----------------- Thread Pool ----------------   
  109.             ObjectName threadpoolObjName = new ObjectName("Catalina:type=ThreadPool,*"); 
  110.             Set<ObjectName> s2 = mbsc.queryNames(threadpoolObjName, null); 
  111.             for (ObjectName obj : s2) { 
  112.                 System.out.println("端口名:" + obj.getKeyProperty("name")); 
  113.                 ObjectName objname = new ObjectName(obj.getCanonicalName()); 
  114.                 System.out.println("最大线程数:" + mbsc.getAttribute(objname, "maxThreads")); 
  115.                 System.out.println("当前线程数:" + mbsc.getAttribute(objname, "currentThreadCount")); 
  116.                 System.out.println("繁忙线程数:" + mbsc.getAttribute(objname, "currentThreadsBusy")); 
  117.             } 
  118.  
  119.         } catch (Exception e) { 
  120.             e.printStackTrace(); 
  121.         } 
  122.     } 
  123.  
  124.     public static String formatTimeSpan(long span) { 
  125.         long minseconds = span % 1000
  126.  
  127.         span = span / 1000
  128.         long seconds = span % 60
  129.  
  130.         span = span / 60
  131.         long mins = span % 60
  132.  
  133.         span = span / 60
  134.         long hours = span % 24
  135.  
  136.         span = span / 24
  137.         long days = span; 
  138.         return (new Formatter()).format("%1$d天 %2$02d:%3$02d:%4$02d.%5$03d", days, hours, mins, seconds, minseconds) 
  139.                 .toString(); 
  140.     } 
  141.  
  142. }  

 

 

  1. import java.util.Iterator;    
  2. import java.util.Set;    
  3. import javax.management.Attribute;    
  4. import javax.management.MBeanInfo;    
  5. import javax.management.MBeanServerConnection;    
  6. import javax.management.MBeanServerInvocationHandler;    
  7. import javax.management.ObjectInstance;    
  8. import javax.management.ObjectName;    
  9. import javax.management.remote.JMXConnector;    
  10. import javax.management.remote.JMXConnectorFactory;    
  11. import javax.management.remote.JMXServiceURL;    
  12. public class Client {    
  13.     public static void main(String[] args) throws Exception {       
  14.         JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/server");       
  15.         JMXConnector jmxc = JMXConnectorFactory.connect(url, null);        
  16.         MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();      
  17.         ObjectName mbeanName = new ObjectName("chengang:name=HelloWorld");    
  18.         // 把所有Domain都打印出来    
  19.         System.out.println("Domains:---------------");       
  20.         String domains[] = mbsc.getDomains();        
  21.         for (int i = 0; i < domains.length; i++) {        
  22.             System.out.println("\tDomain[" + i + "] = " + domains[i]);     
  23.         }    
  24.         // MBean的总数    
  25.         System.out.println("MBean count = " + mbsc.getMBeanCount());    
  26.         // 对name属性的操作(属性名的第一个字母要大写)    
  27.         mbsc.setAttribute(mbeanName, new Attribute("Name""PANDA"));// 设值    
  28.         System.out.println("Name = " + mbsc.getAttribute(mbeanName, "Name"));// 取值    
  29.         // 得到proxy代理后直接调用的方式    
  30.         HelloMBean proxy = (HelloMBean) MBeanServerInvocationHandler.newProxyInstance(mbsc, mbeanName, HelloMBean.classfalse);         
  31.         proxy.printHello();         
  32.         proxy.printHello("Raymend");    
  33.         // 远程调用的方式    
  34.         mbsc.invoke(mbeanName, "printHello"nullnull);          
  35.         mbsc.invoke(mbeanName, "printHello"new Object[] { "熊猫烧香" }, new String[] { String.class.getName() });    
  36.         // 得mbean的信息    
  37.         MBeanInfo info = mbsc.getMBeanInfo(mbeanName);          
  38.         System.out.println("Hello Class: " + info.getClassName());       
  39.         System.out.println("Hello Attriber:" + info.getAttributes()[0].getName());      
  40.         System.out.println("Hello Operation:" + info.getOperations()[0].getName());    
  41.         // 得到所有的MBean的ObjectName    
  42.         System.out.println("all ObjectName:---------------");         
  43.         Set set = mbsc.queryMBeans(nullnull);        
  44.         for (Iterator it = set.iterator(); it.hasNext();) {         
  45.             ObjectInstance oi = (ObjectInstance) it.next();         
  46.             System.out.println("\t" + oi.getObjectName());         
  47.             }
  48.         // 关闭MBeanServer连接    
  49.         jmxc.close();      
  50. }    
手机如何高效辅助林业调查 手机如何高效辅助林业调查 很多林业工作者将栅格类型的地形图处理后导入平板电脑,在林地使用平板电脑加载小班矢量图,辅助林业调查。但是,如果没有地形图底图,这种方法可能就有难度,而且最重要的是,大部分林地工作者没有能力配置平板电脑。大凡林业基层工作者在林地调查时,除调查记录本等部分纸质材料外,都必然携带手机和水杯,此外其他设备已经成为累赘,尤其是炎热的夏季在杂灌丛生的林地进行调查作业。因此,使用手机... 阅读详情

相关推荐

CosyVoice语音合成使用教程

CosyVoice是一款开源的语音合成工具,它基于深度学习模型,能够生成高度逼真的语音内容。该工具支持多种语言的语音生成,包括中文、英文、日文、粤语和韩语。CosyVoice的亮点在于它对生成语音情感和韵律的精细控制,通过富文本或自然语言输入,可以显著提升合成语音的情感表达能力。CosyVoice提供了多种预训练模型,用户可以根据需求选择合适的模型。:基底模型,适用于一般语音合成任务。:经过SFT微调的模型,适用于特定音色和情感的语音合成。:支持Instruct微调的模型,适用于自然语言控制的语音合成。

笔者从事电信媒体开发多年,愿意将多年的开发经验分享给同行 4403

jmx远程调用tomcat和weblogic获取服务器监控性能数据

前言 JMX(Java Management Extensions)是一个为应用程序植入管理功能的框架。JMX是一套标准的代理和服务,实际上,用户可以在任何Java应用程序中使用这些代理和服务实现管理。 应用场景:中间件tomcat和weblogic都支持jmx,需要对其进行配置即可通过接口或者jdk自带的工具jcode获取监控数据 下面通过程序和jcode工具展示数据 一、tomcat和weblogic配置jmx 这里提供tomcat和weblogic的jmx配置和第三方调用,was的待研究 1.tomc

abigale-csdn 1345

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

JMX获取tomcat监控信息

最近用JAVA写了个获取tomcat信息资源的代码,随便保存一下。 大致的步骤全在这了,可以获取到任何想要的指标: 首先可以用JDK提供的工具jconsole来供我们查看,这个在服务端配置下catalina.bat文件,加入以下内容: Linux下要监控的java进程需要配置参数: -Djava.rmi.server.hostname=192.168.1.126 # Lin...

varyall的专栏 1050

关于tomcat繁忙线程数获取

在某些情况下,我们需要对tomcat的繁忙线程数进行监控以满足我们队应用服务器状态信息的把控。那么我们该如何通过我们自定义的接口来获得tomcat的繁忙线程数?         首先,我们应该想到tomcat本身是否为我们提供了类似的方法,博主在实际开发中拜读了一遍tomcat的源码,的确也找到了获取当前服务繁忙线程数的方法。但是它本身并未对外提供,并且使用的时候需要进行一些初始化操作。大家如果

代码搬运工 1万+

jmx获取MBeanServerConnection的两种方法

jmx获取MBeanServerConnection的方法有两种 method1: JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://10.1.60.14:6666/osgi"); JM

yangyan19870319的专栏 1万+

Tomcat 编程式启动 JMX 监控

通过这篇,我们可以了解到,利用 JMX 技术可以方便获取 Tomcat 监控情况。但是我们采用自研的框架而非大家常见的 SpringBoot,于是就不能方便地通过设置配置开启 TomcatJMX,——尽管我们也是基于 Tomcat 的 Web 容器,而是还是 SpringMVC。在笔者一番尝试下,终于实现了“Enable Embedded Tomcat JMX Programmatically”,所谓 Programmatically 就是编程式的用 Java 代码去配置。

zhangxin09的专栏 1587

JMX连接Mbean获取Tomcat信息(jconsole远程查看Mbean)

最近用JAVA写了个获取tomcat信息资源的代码,随便保存一下。 大致的步骤全在这了,可以获取到任何想要的指标: 首先可以用JDK提供的工具jconsole来供我们查看,这个在服务端配置下catalina.bat文件,加入以下内容: setJAVA_OPTS=-Dcom.sun.management.jmxremote-Dcom.sun.manage...

weixin_33895016的博客 674

JMX连接TomcatJMX测试类

首先是为了使tomcat支持JMX,必须在tomcat的启动项里加上以下几行 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.ssl="false" -Dcom.sun.management.jmxremote.authenti...

canofy 296

Monitoring and Managing Tomcat

The Apache Tomcat Servlet/JSP Container Apache Tomcat 7 Version 7.0.103, Mar 16 2020 Apache Logo Links Docs Home FAQ User Comments User Guide 1) Introduction 2) Setup 3) First webapp 4) Deployer 5)...

[Blog][Domain] programb.blog.csdn.net 443

【性能优化】小伙伴问我性能指标监控怎么做,这次我安排上了!!(1)

一次偶然,从朋友那里得到一份“java高分面试指南”,里面涵盖了25个分类的面试题以及详细的解析:JavaOOP、Java集合/泛型、Java中的IO与NIO、Java反射、Java序列化、Java注解、多线程&并发、JVM、Mysql、Redis、Memcached、MongoDB、Spring、Spring Boot、Spring Cloud、RabbitMQ、Dubbo 、MyBatis 、ZooKeeper 、数据结构、算法、Elasticsearch 、Kafka 、微服务、Linux。

2401_84408249的博客 1284

JMX(Java Management Extensions,即Java管理扩展)

1.JMX概念和实例 JMX(Java Management Extensions,即Java管理扩展) Jmx可以将按指定规则创建的javabean保存到java程序进程中并且可以通过jconsole动态修改bean的值当程序中需要配置某些数据时如果将配置信息写死在代码中需要修改代码后重启写死在配置文件中修改配置文件后需要重启如果将数据从配置中读出并且写...

weixin_30622181的博客 253

详解tomcat中的jmx监控

一文详解jmx监控在tomcat中的使用和源码实现。

BugMan的博客 5357

tomca源码06 - 组件扩展管理JMXMBean

tomca源码06 - 组件扩展管理JMXMBean

qq_43350524的博客 859

JMX连接Tomcat (

<br />JMX连接Tomcat(2011-01-02 22:08:59)转载分类:Java学习<br />OS:xp<br />jdk:1.6<br />Tomcat:6.0.29<br />1.Java的环境变量配置正确,网上很多,不再说了<br />2.修改Tomcat目录下的bin/catalina.bat<br />  在该文件中查找set JAVA_OPTS=%JAVA_OPTS%,下面有一行为:<br />  rem ----- Execute The Requested Command -

1157

Tomcat7中的JMX使用(一)Standard MBean

做过Java平台下的应用服务器监控的对JMX应该不会陌生,简单说,JMX就是提供了一个标准的管理方案的框架。这里所说的管理的含义包括监控平台运行状况、应用级别配置资源、收集应用统计数据、调试、监视服务器性能,JMX 允许你将所有的资源(硬件和软件)打包成java 对象,然后将他们暴露在分布式环境中,并且JMX 提供了一个机制,可以很简单的将既存的管理协议,如SNMP ,映射到JMX 自己的管理结构

caomiao2006的专栏 1816

Tomcat 7 中的 JMX 使用(一)Standard MBean

做过 Java 平台下的应用服务器监控的对 JMX 应该不会陌生,简单说 JMX 就是提供了一个标准的管理方案的框架。这里所说的管理的含义包括监控平台运行状况、应用级别配置资源、收集应用统计数据、调试、监视服务器性能,JMX 允许你将所有的资源(硬件和软件)打包成 java 对象,然后将他们暴露在分布式环境中,并且 JMX 提供了一个机制,可以很简单的将既存的管理协议,如 SNMP ,映射到 JMX 自己的管理结构中。 本文重点不是介绍 JMX ,而是分析 Tomcat 7 中是如何用 JMX 来提供管理

weixin_42073629的博客 491

Tomcat中的JMX监控配置:MBean使用指南

Java Management Extensions(JMX,Java管理扩展)是Java平台的一项核心技术,用于监控和管理Java应用程序。Tomcat作为主流的Java Web服务器,内置了完善的JMX支持,允许管理员通过MBean(Managed Bean,管理Bean)对服务器进行实时监控和配置调整。 ### 1.1 为什么需要JMX监控? | 监控方式 | 优势 | 劣势 | 适用场...

gitblog_00363的博客 535
上一篇: 监控Tomcat方案调研(监控应用服务器系列文章一)
下一篇: JMX服务端和客户端的代码
asmallrole
博客等级 码龄15年 2粉丝 0原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值