三、JMX官方指导文档 之 通知

Lesson: Notifications
JMX API定义了一个机制去让MBeans生成通知,例如:状态变化的信号,检测事件或者问题。
为了生成通知,MBean必须实现NotificationEmitter接口或者扩展NotificationBroadcasterSupport类。为了发送一个通知,你需要构造一个 javax.management.Notification或者它子类(AttributeChangedNotification)的实例, 然后把这个实例传递给NotificationBroadcasterSupport.sendNotification。
每一个通知都有源(source)。源是生成通知的MBean对象名字。
每一个通知都有一个序列号。这个号码可以用于给来自同一个源的通知排序。如果不是正确的顺序可能导致一个错误。这个序列号可以是0但最好来自于同一个MBean的通知是自增的。
Hello MBean实现了标准的MBeans,实际上也实现了这个机制。但是,为了简单,这段代码被省略了。完整的Hello代码是:
       package com.example;


	import javax.management.*;


	public class Hello
	        extends NotificationBroadcasterSupport
	        implements HelloMBean {


	    public void sayHello() {
	        System.out.println("hello, world");
	    }


	    public int add(int x, int y) {
	        return x + y;
	    }


	    public String getName() {
	        return this.name;
	    }


	    public int getCacheSize() {
	        return this.cacheSize;
	    }


	    public synchronized void setCacheSize(int size) {
	        int oldSize = this.cacheSize;
	        this.cacheSize = size;


	        System.out.println("Cache size now " + this.cacheSize);


	        Notification n = new AttributeChangeNotification(this,
	                                sequenceNumber++, System.currentTimeMillis(),
	                                "CacheSize changed", "CacheSize", "int",
	                                oldSize, this.cacheSize);


	        sendNotification(n);
	    }


	    @Override
	    public MBeanNotificationInfo[] getNotificationInfo() {
	        String[] types = new String[]{
	            AttributeChangeNotification.ATTRIBUTE_CHANGE
	        };


	        String name = AttributeChangeNotification.class.getName();
	        String description = "An attribute of this MBean has changed";
	        MBeanNotificationInfo info = 
	                new MBeanNotificationInfo(types, name, description);
	        return new MBeanNotificationInfo[]{info};
	    }
	    
	    private final String name = "Reginald";
	    private int cacheSize = DEFAULT_CACHE_SIZE;
	    private static final int DEFAULT_CACHE_SIZE = 200;
	    private long sequenceNumber = 1;
	}



这Hello MBean扩展了NotificationBroadcasterSupport类。NotificationBroadcasterSupport实现了NotificationEmitter 接口。
标准MBean的属性和操作和之前的一样出来CacheSize 的setter方法现在定义了一个oldSize,用于记录CacheSize之前设置的值。
  setCacheSize() 方法里构造了一个AttributeChangeNotification实例,AttributeChangeNotification扩展了javax.management.Notification接口。AttributeChangeNotification 使用了下面的作为参数:
  在Hello MBean里this作为通知的对象名。
  sequenceNumber被设置成1然后自增作为通知的序列号。
  一个时间戳
  消息的内容
  改变的属性的名字
  改变的属性的类型
  老的值,这里是oldSize
  新的值,这里是this.cacheSize
  这个通知n被传递给 NotificationBroadcasterSupport.sendNotification()方法。
  最后, 定义了一个MBeanNotificationInfo实例描述MBean生成的通知的信息。在这个例子里,是AttributeChangeNotification类型的通知。
  
  Running the MBean Notification Example
  再一次运行Hello MBean 然后使用JConsole和他交互,发送和接收消息。 这个例子需要JDk1.6及以后版本。
  1. 如果你已经还没有写好,保存 jmx_examples.zip到你的工作目录。
  2. 解压这个例子,在终端窗口中使用下面的命令。
  unzip jmx_examples.zip
  3. 在工作目录中编译这个例子。
  javac com/example/*.java
  4. 开始Main应用
  java com.example.Main
  5.在不同的终端窗口中开启JConsole
  jconsole
  6.在这个连接窗口中选中com.example.Main然后连接他。
  一个当前平台的概述就展示出来了
  7. 选择MBeans标签
  这个面板展示了当前注册的MBeans。
  8. 在窗体的左边,展开MBean树的com.example节点。
  你可以看到这个例子的Hello MBean被注册为hello。如果你点击hello,你可以看到MBean树的Notifications节点。
  9. 展开Notifications节点。
  这个面板是空白的。
  10. 点击订阅按钮。
  当前的o号通知将被接收到,然后展示在通知节点标签。
  11. 展开Hello MBean的属性节点,然后改变CacheSize属性为150
  在这个Main应用的窗体中,一个属性改变信息被展示。这个接收到的通知的号码也会变成1.
  12. 再展开Hello MBean的Notifications 节点。
  通知的详细被人将被展示。
  13. 关闭JConsole 然后退出。
  























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值