JMX Java Management Extensions
2019独角兽企业重金招聘Python工程师标准>>>
JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。
JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。
JMX是一份规范,就好像JDBC,SUN依据这个规范在JDK提供了JMX接口。
而根据这个接口的实现则有很多种,比如Weblogic的JMX实现、MX4J、JBoss的JMX实现。
在SUN自己也实现了一份,不过在JDK1.4之前,这件JMX实现是可选的,你得去它的网站上下载。
JDK5.0则内嵌了进来,安装JDK5.0就可以开发基于JMX的代码了。
MBean 即 managed beans 被管理的Beans
JMX共有四种MBean:
标准MBeans(Standard MBeans)设计和实现是最简单的,这类MBean使用自己的方法名作为管理接口;
动态MBeans(Dynamic MBeans)必须实现一个指定的接口,由于动态MBeans在运行期间暴露它们的管理接口,因此更为灵活;
开放MBeans(Open MBeans)属于动态MBeans,这类MBean依靠基础数据类型来实现通用管理,并为友情用户进行自我声明;
模型MBeans(Model MBeans)同样也是动态MBeans,这类MBeans是完全可配置的,在运行期间进行自我声明;它们为资源动态工具提供一个一般性的,有默认行为的MBeans类。
通常一个MBean需要定义一个接口,以MBean结尾
public interface EchoMBean {public void print(String name);
}
上面的接口定义了一个echo方法 参数为String类型
public class Echo implements EchoMBean {@Overridepublic void print(String name) {System.out.println("Hello " + name);}}
Echo简单实现了EchoMBean接口 打印Hello +name
按照JMX的定义 我们现在只是实现了这个被管理的对象 而并没有管理起来
import java.lang.management.ManagementFactory;import javax.management.MBeanServer;
import javax.management.ObjectName;public class Example {public static void main(String[] args) throws Exception {MBeanServer server = ManagementFactory.getPlatformMBeanServer();ObjectName name = new ObjectName("mbean:type=Echo");Echo echo = new Echo();server.registerMBean(echo, name);server.invoke(name, "print", new Object[] { "darion.yaphet" },new String[] { "java.lang.String" });Thread.sleep(1000 * 60);}
}
各个步骤主要用来:
ManagementFactory申请一个MBeanServer
给Echo对象被管理起来需要给他起一个名字,作为对象标识符
这里也就是ObjectName , 用包名::type=类名的形式表示
通过server.registerMBean方法注册被管理对象
server.invoke方法调用被注册对象的指定方法 并传入所需参数和参数类型
通过jconsole我们可以调用echo对象上的print方法 并设置指定参数
这种方法可以用来动态设置参数 而不用停止进程
JMX中的订阅模型类似于观察者模式 当有通知到达的时候 通过调用观察者逐一执行
这句话说得不是很明白 举例说明下:
首先定义一个MBean接口:
public interface ServerConfigureMBean {public void setPort(int port);public int getPort();public void setHost(String host);public String getHost();
}
ServerConfigure雷继承了NotificationBroadcasterSupport 实现广播服务
public class ServerConfigure extends NotificationBroadcasterSupport implementsServerConfigureMBean {private AtomicLong sequenceNumber = new AtomicLong(1);private int port;private String host;public void setPort(int port) {int oldPort = this.port;this.port = port;AttributeChangeNotification notification = new AttributeChangeNotification(this, sequenceNumber.getAndIncrement(),System.currentTimeMillis(),AttributeChangeNotification.ATTRIBUTE_CHANGE,"Server Port Change", "java.lang.Integer", oldPort + "",this.port + "");super.sendNotification(notification);}public int getPort() {return port;}public void setHost(String host) {String oldHost = this.host;this.host = host;AttributeChangeNotification notification = new AttributeChangeNotification(this, sequenceNumber.getAndIncrement(),System.currentTimeMillis(),AttributeChangeNotification.ATTRIBUTE_CHANGE,"Server Host Change", "java.lang.String", oldHost, this.host);super.sendNotification(notification);}public String getHost() {return host;}
}
AttributeChangeNotification -- 属性变更通知
参数为:事件源、通知序号、通知发布时间戳、通知message、属性名、属性类型、修改之前的值以及修改之后的值
NotificationBroadcasterSupport用于提供广播机制、调用sendNotification方法发送广播
import javax.management.Notification;
import javax.management.NotificationListener;public class ServerConfigureNotificationListener implementsNotificationListener {public void handleNotification(Notification notification, Object handback) {log("SequenceNumber:" + notification.getSequenceNumber());log("Type:" + notification.getType());log("Message:" + notification.getMessage());log("Source:" + notification.getSource());log("TimeStamp:" + notification.getTimeStamp());}private void log(String message) {System.out.println(message);}
}
简单测试一下 使用这种方法可以动态修改一些配置参数 !~
import java.lang.management.ManagementFactory;import javax.management.MBeanServer;
import javax.management.ObjectName;public class ServerStartup {public static void main(String[] args) throws Exception {MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();ObjectName name = new ObjectName("org.darion.mbean:type=ServerConfigure");ServerConfigure mbean = new ServerConfigure();mbs.registerMBean(mbean, name);ServerConfigureNotificationListener listener = new ServerConfigureNotificationListener();mbs.addNotificationListener(name, listener, null, null);Thread.sleep(1000*120);}
}
参考文献:
http://baike.baidu.com/link?url=nnQdka_1amvgJiQgaCx1XLfXUv_mChQbkGLMREF8NxAeDp9rCAlWAo5tuVEWgUHg
http://blog.csdn.net/qiao000_000/article/category/763467
转载于:https://my.oschina.net/darionyaphet/blog/289889
JMX Java Management Extensions相关推荐
- 【最小demo】JMX (Java Management Extensions)演示最小Demo
参考 JMX超详细解读 https://www.cnblogs.com/dongguacai/p/5900507.html JMX(Java Management Extensions)是一个为应用程 ...
- JMX 使用指南一 Java Management Extensions
1. 什么是 JMX JMX,全称 Java Management Extensions,是在 J2SE 5.0 版本中引入的一个功能.提供了一种在运行时动态管理资源的框架,主要用于企业应用程序中实现 ...
- Java Management extentsions(jmx)与tomcat
1,概念:一个可以使用JMX管理器来管理的Java对象称为JMX管理资源(JMX manageable resource).事实上,一个JMX管理资源也可以是一个应用程序.一个实现或者一个服务.设备. ...
- JMX:Java程序监控的基石
JMX:Java程序监控的基石 一.什么是JMX? 二.JMX架构 1.MBean 1.1 MBean类型 1.2 常用的MBean 1.3 MBean和MXBean的区别 2.MBeanServer ...
- java jmx连接_使用JMX连接JVM
什么是JMX? 什么是JMX,Java Management Extensions,即Java管理扩展,是一个为应用程序.设备.系统等植入管理功能的框架.JMX可以跨越一系列异构操作系统平台.系统体系 ...
- [JMX一步步来] 1、JMX的Hello World
一.JMX简介 什么是JMX?在一篇网文中是这样说的:"JMX(Java Management Extensions)是一个为应用程序植入管理功能的框架.JMX是一套标准的代理和服务,实际上 ...
- 为Web应用建立基于JMX的管理系统
Web应用系统总算开发了,接下来该如何让客户(Web应用系统的管理员)轻松管理我的一堆配置文件,或者如何实现动态修改系统运行属性,同时又让客户不需要过多的了解配置文件的内容就能够实现这些管理呢?这是许 ...
- Java虚拟机详解(八)------虚拟机监控和分析工具(2)——可视化
上篇博客我们介绍了虚拟机监控和分析命令行工具,由于其不够直观,不是很容易排查问题,那么本篇博客我们就来介绍几个可视化工具. 1.JConsole JConsole(Java Monitoring an ...
- java array 元素的位置_Java常见面试题 非常实用「个人经验」
Java 容器都有哪些 Collection 的子类 List.Set List 的子类 ArrayList.LinkedList等 Set 的子类 HashSet.TreeSet等 Map 的子类 ...
- 整理的常用JAVA开源库简介
Jakarta common: Commons Logging Jakarta Commons Logging (JCL)提供的是一个日志(Log)接口(interface),同时兼顾轻量级和不依赖于 ...
最新文章
- Django视图之HttpRequest对象和HttpResponse对象
- 海量大数据处理最新面试题-1
- Deno 1.0?我还没好好研究 Node,你就这样推倒重做?
- python extractall函数_Pandas从str.extractall('#')中给出错误
- C#求空间两点之间的距离
- 安装开源 ITIL 门户 iTOP
- 解读华为云原生数据库设计原则,打破传统数据库上云瓶颈
- 用 1 行 Python 代码实现 FTP 服务器 - Pyftpdlib
- Python之输入输出
- Linq中查询List组合相同值数量大于1
- VMware Data Recovery安装配置
- 【机器人学:运动规划】快速搜索随机树(RRT---Rapidly-exploring Random Trees)入门及在Matlab中演示
- 集成运放的电压跟随器有什么作用?
- [面试必考]OSI 网络七层协议以及各层的功能
- SpringBoot之下载Excel
- java余弦距离_使用TensorFlow实现余弦距离/欧氏距离(Euclideandistance)以及Attention矩阵的计算...
- 华为p60art参数配置 华为p60art怎么样
- Windows 安全资料库网站
- 图片查看器 Viewer.js
- 关于ROS功能包里package.xml和CMakeList.txt的源码分析
热门文章
- cvpr 深度估计_北京航空航天大学团队在CVPR2017-4D光场深度估计竞赛中夺冠
- 示波器采样速率单位Ms/s、Gs/s
- xp计算机保护系统,XP系统总是弹出“Windows文件保护”窗口提示的解决方法
- php 延迟输出,PHP循环;如何打印每个结果并将其延迟一秒钟,然后再回显另一个结果?...
- 2017-2018-2 20179302 《网络攻防》第三周作业
- 5款免费的WordPress备份解决方案
- [Node.js]操作mysql
- Javascript对象数组排序
- 11G新特性 -- Expression Statistics
- Imc手机连环画PC阅读器