- 浏览: 378773 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
u014689192:
很不错
JMX学习笔记(三)-MXBean -
focus2008:
进制转换之后,根本不会执行js代码,感觉你没有测试过吧
xss漏洞之进制转换 -
focus2008:
如何使用过滤器来处理呢?
xss漏洞之进制转换 -
1169158401:
我艹,我那天这么写,包括一些方法,然后那货说这样写不容易看懂。 ...
import static简化代码 -
AquariusM:
奢华的JVM介绍!
JMX学习笔记(三)-MXBean
Notification 通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知.
这里写一个简单的Server配置例子, 首先定义我们的MBean接口:
package com.haitao.jmx.mbeans.server; /** * * Server Configure MBean * * @author haitao.tu * */ public interface ServerConfigureMBean { public void setPort(int port); public int getPort(); public void setHost(String host); public String getHost(); }
接着,我们会想第一节那样,去实现这个MBean接口,并且继承NotificationBroadcasterSupport,来提供广播服务:
package com.haitao.jmx.mbeans.server; import java.util.concurrent.atomic.AtomicLong; import javax.management.AttributeChangeNotification; import javax.management.NotificationBroadcasterSupport; /** * Server Configure * * @author haitao.tu * */ public class ServerConfigure extends NotificationBroadcasterSupport implements ServerConfigureMBean { private AtomicLong sequenceNumber = new AtomicLong(1); private int port; private String host; @Override 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); } @Override 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); } @Override public int getPort() { return port; } @Override public String getHost() { return host; } }
在setPort与setHos方法中,首先new了一个AttributeChangeNotification,这个类是javax.management.Notification的子类,而javax.management.Notification
这个类又是java.util.EventObject的子类,由此可以证实上边所说的,JMX通知机制使用了观察者设计模式.
javax.management.Notification是一个JMX的通知核心类,将来需要扩展或者其他JMX自带的消息,均继承自此类.
AttributeChangeNotification根据类名可知,是一个属性改变的通知,造方法参数如下:
Object source, // 事件源,一直传递到java.util.EventObject的source
long sequenceNumber, // 通知序号,标识每次通知的计数器
long timeStamp, // 通知发出的时间戳
String msg, // 通知发送的message
String attributeName, // 被修改属性名
String attributeType, // 被修改属性类型
Object oldValue, // 被修改属性修改以前的值
Object newValue // 被修改属性修改以后的值
根据观察者模式,由事件与广播组成,所以这里继承了NotificationBroadcasterSupport,来提供广播机制,
调用NotificationBroadcasterSupportr的sendNotification(notification) 发送广播,广播会根据注册的观察者
来对观察者进行逐一通知.
sendNotification 在JDK1.6是通过Executor来发送通知,默认调用线程同步发送:
public NotificationBroadcasterSupport(Executor executor, MBeanNotificationInfo... info) { this.executor = (executor != null) ? executor : defaultExecutor; notifInfo = info == null ? NO_NOTIFICATION_INFO : info.clone(); }
private final static Executor defaultExecutor = new Executor() { // DirectExecutor using caller thread public void execute(Runnable r) { r.run(); } };
如果想用异步发送通知,大家可以在构造方法中传入异步执行的Executor , 例如 ThreadPoolExecutor.
接下来,还得写一个观察者,来接受我们送出的通知:
package com.haitao.jmx.mbeans.server; import javax.management.Notification; import javax.management.NotificationListener; /** * Server Configure Notification Listener * * @author haitao.tu * */ public class ServerConfigureNotificationListener implements NotificationListener { @Override 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); } }
这里只是简单输出了通知内容, 在这个类中我们实现NotificationListener接口,可以看出该接口中只有一个方法,
就是处理消息,顺藤摸瓜,在看一下NotificationListener的接口代码:
package javax.management; import java.util.EventListener; /** * Should be implemented by an object that wants to receive notifications. * * @since 1.5 */ public interface NotificationListener extends java.util.EventListener { /** * Invoked when a JMX notification occurs. * The implementation of this method should return as soon as possible, to avoid * blocking its notification broadcaster. * * @param notification The notification. * @param handback An opaque object which helps the listener to associate information * regarding the MBean emitter. This object is passed to the MBean during the * addListener call and resent, without modification, to the listener. The MBean object * should not use or modify the object. * */ public void handleNotification(Notification notification, Object handback) ; }
可以很清楚的看出继承了java.util.EventListener接口,又一次证实了,JMX通知机制是观察者模式的衍生产品.
好了,所有的功能代码都写完了,下边需要测试一JMX的通知机制:
这里还需要写一个测试用例来支持:
package com.haitao.jmx.mbeans.server; 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 MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); // 新建MBean ObjectName, 在MBeanServer里标识注册的MBean ObjectName name = new ObjectName("com.haitao.jmx.mbeans.server:type=ServerConfigure"); // 创建MBean ServerConfigure mbean = new ServerConfigure(); // 在MBeanServer里注册MBean, 标识为ObjectName(com.haitao.jmx.mbeans.server:type=ServerConfigure) mbs.registerMBean(mbean, name); // 自定义观察者 ServerConfigureNotificationListener listener = new ServerConfigureNotificationListener(); // 加入MBeanServer mbs.addNotificationListener(name, listener, null, null); Thread.sleep(Long.MAX_VALUE); } }
最后,我们开始验证成果:
1.打开%JAVA_HOME%/bin/jconsole连接到本地进程:
2. 进入MBean选项框, 点击左边的树,打开通知:
3. 订阅通知
4. 修改属性,产生通知
5. 验证通知
OK, 学习笔记二写完了,回想下一,
1. JMX中要定义接口必须以xxxMBean的规范定义
2. 得有类实现xxxMBean接口
3. 在实现类中可以继承NotificationBroadcasterSupport来支持通知机制
4. 可以通过jconsole来验证
:)
评论
不知道JConsole(或者JMX客户端)是怎样对一个MBean的事件进行订阅的?
而不是类似下面的代码:
// 加入MBeanServer
mbs.addNotificationListener(name, listener, null, null);
发表评论
-
import static简化代码
2011-11-03 00:10 1699喜欢定义常量的哥们你伤不起啊,好处当然是大大滴,但是定义的名字 ... -
Java永远的伤-中国1927年12月31日午夜
2011-08-15 20:44 3897话说在中国1927年12月31日午 ... -
高性能的SimpleDateFormat
2011-07-18 23:35 3867以前写过一篇 , 《SimpleDateFormat性能调优》 ... -
xss漏洞之进制转换
2011-07-18 01:17 11274SQL注入的事件已经是上个世纪最令人头疼的攻击方法,21世纪又 ... -
tomcat关不掉的原因
2011-07-12 23:51 43534tomcat/bin 目录下的catalina.sh是比较常用 ... -
接口调用频率限制代码
2011-06-28 20:49 10614有很多时候我们写的代码不是你想跑多快就能跑多快的, 因为一些陈 ... -
java调用linux命令传递参数问题
2011-05-18 02:04 10736简单的不带通配符linux命令调用非常简单,使用Runtime ... -
Java位运算的优势
2011-04-09 01:58 2296在Java中对数据的运算,有很好的规范支持,尤其是针对二进制的 ... -
Facebook BigPipe技术
2011-01-04 00:37 2695关于web应用,从html的产生,到客户端浏览器的渲染, ... -
SimpleDateFormat性能调优
2010-11-25 00:12 4219万能的SimpleDateFormat可以把java.util ... -
JMX学习笔记(三)-MXBean
2010-11-10 11:25 4997在MBean中有只要遵循以下两个规则,我们就可以在jc ... -
JMX学习笔记(一)-MBean
2010-10-16 16:27 13654JMX 即 Java Management Ex ... -
cookie安全
2010-07-06 01:09 4148cookie的domian,path,expires, ... -
native2ascii转换后仍然乱码
2010-04-18 17:47 1817native2ascii转换的时候如果不带-encoding ... -
JPA换进下慎用entity
2010-01-26 11:36 2630今天跟一个同事调试代码,突然发现,诸如findUser ... -
http session原理
2009-12-02 00:41 2862大家都知道session是web中在服务器端保存用户状 ... -
java中获得当前目录的各种方法
2009-09-04 11:21 14384Java本来就是跨平台的编程工具,所以当然要做跨平台的 ... -
String、StringBuffer与StringBuilder
2009-04-26 22:04 1928先不废话了,来段程序: package com.tuz; ...
相关推荐
标签:agent-jmx-3.0.1-javadoc.jar,agent,jmx,3.0.1,javadoc,jar包下载,依赖包
tomcat8监控jar包,catalina-jmx-remote java-visualVM专用
tomcat9监控jar包,catalina-jmx-remote java-visualVM专用
NULL 博文链接:https://90haofang-163-com.iteye.com/blog/1902211
tomcat-catalina-jmx-remote-9.0.5 tomcat-catalina-jmx-remote-9.0.5.jar
tomcat7监控jar包,catalina-jmx-remote java-visualVM专用
**JMX(Java Management Extensions)**是Java平台提供的一种用于管理与监控应用程序、操作系统和网络设备的标准框架。在本文中,我们将深入探讨JMX如何与Spring框架整合,以实现更高效的服务管理和监控。 首先,**...
1. **jmx-1_2_1-ri.zip**:这个文件提供了JMX 1.2.1版本的运行时实现(Runtime Implementation,RI)。RI是JMX规范的具体实现,允许开发者在Java应用程序中使用JMX功能,如创建MBeans(Managed Beans),管理对象和...
**JMX(一)——MBean Server** Java Management Extensions (JMX) 是Java平台上的一个标准,用于管理和监控应用程序、设备和服务。它提供了一个灵活的框架,使得开发者能够轻松地创建可管理的组件,并通过标准接口...
通过配置tomcat/bin/catalina.sh使用。使用方法参照:https://blog.51cto.com/13700457/2397812
Description Resource Path Location Type Missing artifact com.sun.jmx:jmxri:jar:1.2.1 pom.xml /eshop-storm line 2 Maven Dependency Problem
`jmx-tools.zip`这个压缩包可能包含了一些用于操作和可视化JMX功能的工具。 `HtmlAdaptorServer`是JMX提供的一种机制,它允许通过HTTP协议访问和管理MBeans。这个服务器实现了一个JMX远程过程调用(RMI)接口,使得...
maven编译时报找不到这两个jar文件,发现已经无法从网站...Could not resolve dependencies for project ****:jar:0.0.1-SNAPSHOT: The following artifacts could not be resolved: com.sun.jdmk:jmxtools:jar:1.2.1, ...
Tomcat 8 Extras catalina-jmx-remote.jar,JMX监控所需文件之一。 JMX Remote Lifecycle Listener - org.apache.catalina.mbeans.JmxRemoteLifecycleListener
jmx-prometheus-httpserver-0.17.2
标签:agent-jmx-3.0-beta-1.jar,agent,jmx,3.0,beta,1,jar包下载,依赖包
标签:agent-jmx-3.0-beta-1-sources.jar,agent,jmx,3.0,beta,1,sources,jar包下载,依赖包
标签:agent-car-jmx-3.0-beta-1-sources.jar,agent,car,jmx,3.0,beta,1,sources,jar包下载,依赖包
首先,`cmdline-jmxclient-0.10.3.jar`是一个命令行Java Management Extensions (JMX)客户端,它允许通过JMX协议远程访问和管理Java应用程序,如Tomcat。JMX是一种标准的Java技术,用于管理和监控Java应用程序的运行...