- 浏览: 1595574 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
jsrgzhangzhiyong:
关于null值的转换还是感觉不太友好,就像 mapstruct ...
我也造了个轮子:BeanMapping(属性拷贝) -
he037:
a417930422 写道引用使用EPHEMERAL会引出一个 ...
基于zookeeper的分布式lock实现 -
seancheer:
qianshangding 写道首先节点启动后,尝试读取本地的 ...
zookeeper学习记录三(session,watcher,persit机制) -
雪夜归人:
您好,我想咨询一下,开源的canal都能支持mysql的哪些版 ...
Canal BinlogChange(mysql5.6) -
zhoudengyun:
copy 一份做记录,后续学习,请知悉
阿里巴巴开源项目: 基于mysql数据库binlog的增量订阅&消费
背景
前段时间在看btrace源码和jdk一些源码的时候,经常会看到一些jmx的相关内容。以前对jmx基本是一片空白区,花了点时间学习记录下。
过程
jmx总体架构图:
说明:
1. Agent : javax.management.MBeanServer实现了Agent的功能,以标准的方式给出了管理系统访问 JMX 框架的接口
2. SubAgent: javax.management.MBeans实现了SubAgent的功能,以标准的方式给出了 JMX 框架访问资源的接口
MBean是Management Bean的缩写,负责将可管理资源和服务封装成类似Java Bean的形式。通过MBean的特性可以访问可管理资源的各类信息。MBean对资源的封装体现在以下几个方面:
* 属性名称及读写类型。
* 对资源的操作。
* 指定类型的通知。
从MBean的实现上来看,MBean分为两种类型:
- 标准(Standard)MBean
- 动态(Dynamic) MBean , 又进一步可分为Open MBean和Model MBean
Opean Mbean:与其它动态 MBean 的唯一区别在于,前者对其公开接口的参数和返回值有所限制。只能是基本类型或者 javax.management.openmbean 包内的 ArrayType、CompositeType、TarbularType 等类型。考虑到管理系统的分布,很可能远端管理系统甚至 MBServer 层都不具有 MBean 接口中特殊的类。
Model Mbean: 普通的动态 Bean 通常缺乏一些管理系统所需要的支持,JMX 提供商都会提供不同的 ModelBean 实现。其中有一个接口是 Java 规范中规定所有厂商必须实现的:javax.management.modelmbean.RequiredModelBean。通过配置 Descriptor 信息,我们可以定制这个 Model Bean, 指定哪些 MBean 状态需要记入日志、如何记录以及是否缓存某些属性、缓存多久等等。
Object Name介绍
ObjectName:是MBean的唯一标识,它在MBean向MBean服务器中注册时指定。管理应用可以通过这个标识来寻址MBean。Object Name体现了MBean服务器关于MBean的命名机制,这一机制是管理应用和MBean之间实现松耦合的关键。
Object Name的语法如下:
[domainName]:property=value[,property=value]*
可以看到,Object Name由两部分组成:域名和一组关键属性,具体说明如下。
(1) 域名(Domain Name)
关于域名的命名和Java包的约定一致,即“反向的DNS名 + 组织自定义的字串”。比如由Sun公司开发的MBean,其DNS名是sun.com,则其域名格式是com.sun.MyDomain。
(2) 关键属性(Key Properties)
关键属性是一些Key-value对,通过它们可以为MBean在指定的域中添加包括名字、类型和说明等属性,但这些属性可以不是MBean的实际属性。
例子: MyDomain:description=Printer,type=laser
资料:
标准MBean例子:
1. 定义MBean接口
public interface StandardServerMonitorMBean { public long getUpTime(); public void start(); }
说明:
- MBean的类命名和方法命名上存在一些约定
类命名:需要监控的类名基础上加上"MBean",做为接口名字。对应的监控类必须实现该接口,通过该接口可以表述需要被jmx管理的attribute , operation信息等。
方法名: get/set/is打头的代表的是一个attribute, 其他的一些方法定义做为可被操作的operation。 - 方法名,注意是去掉get/set/is后的name , 注意第一个字母大写。 这里就是UpTime
2. 实现具体的监控类
public class StandardServerMonitor implements StandardServerMonitorMBean { public long startTime = 0; public long getUpTime() { return System.currentTimeMillis() - startTime; } @Override public void start() { startTime = System.currentTimeMillis(); } }
说明:
- 必须实现 类名+MBean 的一个接口
3. 调用测试
StandardServerMonitor serverMonitor = new StandardServerMonitor(); // 注册mbean MBeanServer mBeanServer = MBeanServerFactory.createMBeanServer(); ObjectName objectName = new ObjectName("objectName: id=serverMonitor"); mBeanServer.registerMBean(serverMonitor, objectName); // mbean调用 mBeanServer.invoke(objectName, "start", null, null); Thread.sleep(1000); Long upTime = (Long) mBeanServer.getAttribute(objectName, "UpTime"); System.out.println("uptime : " + upTime);
输出结果:
uptime : 1000
DynamicMBean例子:
1. 实现Dynamic接口
public class DynamicServerMonitor implements DynamicMBean { private MBeanInfo mBeanInfo; private StandardServerMonitor monitor; public DynamicServerMonitor(StandardServerMonitor monitor){ this.monitor = monitor; } @Override public Object getAttribute(String attribute) throws AttributeNotFoundException, MBeanException, ReflectionException { if (attribute.equals("UpTime")) { return monitor.getUpTime(); } return null; } @Override public AttributeList getAttributes(String[] attributes) { AttributeList result = new AttributeList(); for (String attr : attributes) { if (attr.equals("UpTime")) { result.add(monitor.getUpTime()); } } return result; } @Override public MBeanInfo getMBeanInfo() { if (mBeanInfo == null) { try { Class cls = StandardServerMonitor.class; // 用反射获得 "upTime" 属性的读方法 Method readMethod = cls.getMethod("getUpTime", new Class[0]); // 用反射获得构造方法 Constructor constructor = cls.getConstructor(); // 关于 "upTime" 属性的元信息:名称为 UpTime,只读属性(没有写方法)。 MBeanAttributeInfo upTimeMBeanAttributeInfo = new MBeanAttributeInfo( "UpTime", "The time span since server start", readMethod, null); // 关于构造函数的元信息 MBeanConstructorInfo mBeanConstructorInfo = new MBeanConstructorInfo("Constructor for ServerMonitor", constructor); // ServerMonitor 的元信息,为了简单起见,在这个例子里, // 没有提供 invocation 以及 listener 方面的元信息 mBeanInfo = new MBeanInfo(cls.getName(), "Monitor that controls the server", new MBeanAttributeInfo[] { upTimeMBeanAttributeInfo }, new MBeanConstructorInfo[] { mBeanConstructorInfo }, null, null); } catch (Exception e) { throw new Error(e); } } return mBeanInfo; } @Override public Object invoke(String actionName, Object[] params, String[] signature) throws MBeanException, ReflectionException { Class[] parmeterClass = null; if (params != null) { parmeterClass = new Class[params.length]; for (int i = 0; i < params.length; i++) { parmeterClass[i] = params[i].getClass(); } } try { Method method = StandardServerMonitor.class.getMethod(actionName, parmeterClass); return method.invoke(monitor, params); } catch (Exception e) { e.printStackTrace(); } return null; } @Override public void setAttribute(Attribute attribute) throws AttributeNotFoundException, InvalidAttributeValueException, MBeanException, ReflectionException { } @Override public AttributeList setAttributes(AttributeList attributes) { return null; } }
说明: 需要实现getAttribute/setAttribute的方法,包括invoke方法。 自己实现相应的监控方法路由
2. 调用例子
StandardServerMonitor serviceMonitor = new StandardServerMonitor(); DynamicServerMonitor dynamicServerMonitor = new DynamicServerMonitor(serviceMonitor); // 注册mbean MBeanServer mBeanServer = MBeanServerFactory.createMBeanServer(); ObjectName objectName = new ObjectName("objectName:id=dynamicServerMonitor"); mBeanServer.registerMBean(dynamicServerMonitor, objectName); // mbean调用 mBeanServer.invoke(objectName, "start", null, null); Thread.sleep(1000); Long upTime = (Long) mBeanServer.getAttribute(objectName, "UpTime"); System.out.println("uptime : " + upTime);
java.lang.management系列
jvm 1.5之后默认提供了一些MBean,用于管理jvm资源,具体的MBean如下:
Object Name | MXBean | 方法描述 |
java.lang:type=ClassLoading | ClassLoadingMXBean | 包括一些类的装载信息,比如有多少类已经装载/卸载(unloaded),虚拟机类装载的 verbose 选项(即命令行中的 Java –verbose:class 选项)是否打开,还可以帮助用户打开/关闭该选项。 |
java.lang:type=Compilation | CompilationMXBean | 帮助用户了解当前的编译器和编译情况 |
java.lang:type=Memory | MemoryMXBean | 提供了整个虚拟机中内存的使用情况,包括 Java 堆(heap)和非 Java 堆所占用的内存,提供当前等待 finalize 的对象数量,它甚至可以做 gc(实际上是调用 System.gc) |
java.lang:type=OperatingSystem | OperatingSystemMXBean | 该类提供的是操作系统的简单信息,如构架名称、当前 CPU 数、最近系统负载等 |
java.lang:type=Runtime | RuntimeMXBean | 运行时信息包括当前虚拟机的名称、提供商、版本号,以及 classpath、bootclasspath 和系统参数等等 |
java.lang:type=Threading | ThreadMXBean | 可以提供的信息包括各个线程的各种状态,CPU 占用情况,以及整个系统中的线程状况。从 ThreadMXBean 可以得到某一个线程的 ThreadInfo 对象。这个对象中则包含了这个线程的所有信息 |
java.lang:type=GarbageCollector | GarbageCollectorMXBean | 仅仅提供了 GC 的次数和 GC 花费总时间的近似值 |
java.lang:type=MemoryManager | MemoryManagerMXBean | 提供了内存管理类和内存池(memory pool)的名字信息 |
java.lang:type=MemoryPool | MemoryPoolMXBean | 在 JVM 中,可能有几个内存池,因此有对应的内存池信息,因此,在工厂类中,getMemoryPoolMXBean() 得到是一个 MemoryPoolMXBean 的 list。每一个 MemoryPoolMXBean 都包含了该内存池的详细信息,如是否可用、当前已使用内存/最大使用内存值、以及设置最大内存值等等 |
说明:
1. 通过MemoryMXBean ,可以实现内存阀值控制,比如自定义一个javax.management.NotificationListener,在内存低于MemoryNotificationInfo.MEMORY_THRESHOLD_EXCEEDED,进行消息提醒,邮件或者短信等
2. 通过ThreadMXBean ,可以通过getLockedMonitors(),getLockedSynchronizers(),getLockInfo()获取锁信息,通过findDeadlockedThreads()检测死锁
最后
简单的整理下jmx的相关知识,可以做为入门教程。 线上的一些监控可以通过jmx进行监控处理,做为了解还是不错的
评论
1 楼
gogole_09
2011-08-05
public interface StandardServerMonitorMBean { public long getUpTime(); public void start(); }
lz 这个接口的命名貌似会有问题哦,
会抛出 javax.management.NotCompliantMBeanException异常。
好像是要依循xxxxMXBean 这样的格式吧。
发表评论
-
yugong QuickStart
2016-03-05 01:52 0几点说明 a. 数据迁移的方案可参见设计文档,oracl ... -
阿里巴巴开源项目: 阿里巴巴去Oracle数据迁移同步工具
2016-03-05 18:29 6509背景 08年左右,阿里巴巴开始尝试MySQL的相关 ... -
愚公performance
2016-03-02 17:29 0性能测试 全量测试 场景1 (单主键, ... -
yugong AdminGuide
2016-03-02 16:40 0环境要求 操作系统 数据库 迁移方案 部署 ... -
Tddl_hint
2014-01-27 13:52 0背景 工作原理 Hint格式 direct模 ... -
tddl5分库规则
2014-01-26 14:41 0背景 工作原理 构建语法树 元数据 基于 ... -
tddl5优化器
2014-01-22 15:12 0背景 工作原理 构建语法树 元数据 抽象语 ... -
Canal BinlogChange(mariadb5/10)
2014-01-20 17:25 4587背景 先前开源了一个 ... -
asynload quickstart
2013-10-08 22:49 0几点说明: 1. asyncload是做为一个j ... -
网友文档贡献
2013-09-18 15:50 01. Otter源代码解析系列 链接:http://e ... -
Manager配置介绍
2013-09-16 13:00 0通道配置说明 多种同步方式配置 a. 单向同步 ... -
canal&otter FAQ
2013-09-05 17:30 0常见问题 1. canal和 ... -
阿里巴巴开源项目:分布式数据库同步系统otter(解决中美异地机房)
2013-08-22 16:48 40433项目背景 阿里巴巴B2B公司,因为业务的特性 ... -
Otter AdminGuide
2013-08-19 11:06 0几点说明 otter系统自带了manager,所以简化了一 ... -
Otter高可用性
2013-08-17 23:41 0基本需求 网络不可靠,异地机房尤为明显. man ... -
Otter数据一致性
2013-08-17 23:39 0技术选型分析 需要处理一致性的业务场景: 多地修改 ( ... -
Otter扩展性
2013-08-17 22:20 0扩展性定义 按照实现不同,可分为两类: 数据处理自定 ... -
Otter双向回环控制
2013-08-17 21:37 0基本需求 支持mysql/oracle的异构数据库的双 ... -
Otter调度模型
2013-08-17 20:13 0背景 在介绍调度模型之前,首先了解一下otter系统要解 ... -
Otter Manager介绍
2013-08-16 11:16 0背景 otter4.0发布至 ...
相关推荐
一个简单的JMX示例是创建一个名为`Hello`的类,该类实现了`HelloMBean`接口。`HelloMBean`定义了`getName()`和`setName()`方法,以及`printHello()`方法。`Hello`类中的这些方法允许外部管理工具获取和设置名称,...
JMX(Java Management Extensions)是Java平台上的一个...结合源码学习和使用工具,JMX可以帮助我们更好地理解和控制我们的Java应用程序。无论是开发人员还是运维人员,熟悉和掌握JMX都将对日常工作带来极大的便利。
Java Management ...总之,JMX提供了一种灵活、统一的方式来管理和监控Java应用,而"最简单JMX例子"是学习这项技术的良好起点。通过实际操作这个例子,你将更好地理解JMX的工作机制,并能将其运用到自己的项目中。
在这个“jmx简单实例”中,我们将会探讨JMX的基本概念,以及如何使用所提供的jar包来构建和运行一个简单的JMX示例。 1. **JMX基础** JMX由三部分组成:MBeans(Managed Beans)、Servers和Agents。MBeans代表管理...
Java语言进行封装。JMX的核心概念是MBean(Managed Bean),它是一个Java...对于初学者,了解JMX的基本概念、MBean、MBean服务器以及其层次结构是学习的关键,这些知识将有助于开发和维护高效、可管理的Java应用程序。
6. **客户端示例**:项目可能还包含一个简单的客户端示例,展示了如何使用JMX API连接到MBean服务器,查询MBean信息,调用其操作,以及监控和改变MBean的属性。 通过分析`jmxdemo`项目的源代码,你可以学习如何创建...
接下来,我们可以通过编写一个简单的HelloWorld示例来理解JMX的工作原理。在这个例子中,我们创建一个名为Hello的类,它实现了HelloMBean接口。HelloMBean接口是我们在MBean服务器中注册的管理接口,包含了我们想要...
**标题解析:** "JMX HelloWorld Download" 指的是一个关于Java Management Extensions(JMX)的简单示例,可能是用于教学或演示如何在Java应用中使用JMX技术。"Download"表明这是一个可以下载的资源,可能包含了...
标题和描述均提到了“jmx第一个学习例子”,这标志着文章旨在引导读者通过一个实践性的示例理解Java Management Extensions(JMX)的基础概念和技术。JMX作为一项由Sun Microsystems(现Oracle)提出的技术,用于...
学习JMX有助于开发者在遇到性能问题时进行诊断,或者在生产环境中实施自动化运维策略。例如,你可以使用JMX监控内存使用情况、线程状态,甚至触发某些操作,如重启服务或更新配置。 总的来说,JMX是一个强大的工具...
通过学习并实践这些JMX的例子,开发者能够熟练掌握如何利用JMX进行应用的管理和监控,提高系统的可维护性和稳定性。对于大型分布式系统,JMX的价值尤为突出,它为系统运维提供了一种灵活、强大的工具集。
JMX(Java Management Extensions)是Java平台提供的一种标准管理框架,用于管理和监控应用程序、设备和服务。这个例子将探讨如何在实际...通过学习和实践JMX,开发者可以更好地掌握Java应用的生命周期管理和故障排查。
10. **JMX与Spring整合**:Spring框架提供了与JMX的集成,使得在Spring应用中注册和管理MBeans变得简单。Spring的`MBeanExporter`和`@ManagedResource`注解是实现这一目标的关键。 综上所述,JMX是一个强大的工具,...
通过实践,学习者可以更深入地掌握JMX的精髓。 总结来说,JMX是Java平台的重要管理工具,它提供了一种统一的接口来管理和监控应用程序和服务。通过《JMX技术介绍》一书及其配套源代码,读者可以深入了解并熟练运用...
通过这个示例源码,开发者可以学习如何在Java应用中集成JMX,了解如何创建、注册和管理MBeans,以及如何从远程进行监控和操作。这对于大型分布式系统或需要精细监控的应用尤其有用,因为JMX可以帮助开发者更好地理解...
完成本章的学习后,你将能够管理你的第一个资源,创建一个简单的JMX代理,并通过Web浏览器与代理进行交互。具体来说,你会创建一个MBean,利用MBean服务器,并使用Sun在JMX RI中提供的HTML适配器来管理MBean。 首先...
这通常涉及到SMTP(简单邮件传输协议)和可能的JavaMail API的使用。邮件服务可以用于自动化报告、通知或者任何需要通过电子邮件进行通信的应用场景。 “队列”和“线程定时任务功能”则表明项目内可能包含任务调度...