文档

Java™ 教程
目录: Java 管理扩展 (JMX)

课程:通知

JMX API定义了一种机制,使MBean能够生成通知,例如,用于表示状态更改、检测到的事件或问题。

要生成通知,一个MBean必须实现接口NotificationEmitter或扩展NotificationBroadcasterSupport。要发送通知,您需要构造一个javax.management.Notification类的实例或其子类(如AttributeChangedNotification),并将实例传递给NotificationBroadcasterSupport.sendNotification

每个通知都有一个源。源是生成通知的MBean的对象名称。

每个通知都有一个序列号。当顺序很重要且有可能处理通知时按错误顺序处理时,可以使用此号码来对来自相同源的通知进行排序。序列号可以为零,但最好对来自给定MBean的每个通知递增。

Hello MBean实现在标准MBeans中实际上实现了通知机制。然而,出于简单起见,该课程中省略了这段代码。完整的Hello代码如下:

package com.example;

import javax.management.*;

public class Hello
        extends NotificationBroadcasterSupport
        implements HelloMBean {

    public void sayHello() {
        System.out.println("你好,世界");
    }

    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("缓存大小现在是 " + this.cacheSize);

        Notification n = new AttributeChangeNotification(this,
                                sequenceNumber++, System.currentTimeMillis(),
                                "缓存大小已更改", "缓存大小", "int",
                                oldSize, this.cacheSize);

        sendNotification(n);
    }

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

        String name = AttributeChangeNotification.class.getName();
        String description = "此MBean的属性已更改";
        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属性的值。

通知是由JMX类AttributeChangeNotification的实例n构造的,该类继承自javax.management.Notification。通知在setCacheSize()方法的定义中构造,构造时使用以下信息作为参数传递给AttributeChangeNotification

然后将通知n传递给NotificationBroadcasterSupport.sendNotification()方法。

最后,定义MBeanNotificationInfo实例来描述MBean生成的不同类型的通知实例的特性。在本例中,发送的通知类型是AttributeChangeNotification通知。

运行MBean通知示例

再次使用JConsole与Hello MBean交互,这次是用来发送和接收通知。此示例需要Java SE平台的6版本。

  1. 如果你还没有这么做,请将jmx_examples.zip保存到你的work_dir目录中。
  2. 在终端窗口中使用以下命令解压样例类的包。
    unzip jmx_examples.zip
    
  3. work_dir目录中编译示例Java类。
    javac com/example/*.java
    
  4. 启动Main应用程序。
    java com.example.Main
    

    会生成一个提示,表示Main正在等待某些操作。

  5. 在同一台机器的不同终端窗口中启动JConsole。
    jconsole
    

    会显示一个新的连接对话框,其中列出了可以连接的正在运行的JMX代理。

  6. 在新的连接对话框中,从列表中选择com.example.Main,然后点击连接。

    会显示当前平台活动的摘要。

  7. 点击MBeans标签。

    该面板显示了当前在MBean服务器中注册的所有MBean。

  8. 在左侧框架中展开MBean树中的com.example节点。

    你会看到由Hello创建并注册的示例MBean。如果你点击Hello,你会在MBean树中看到它的通知节点。

  9. 在MBean树中展开Hello MBean的通知节点。

    请注意面板是空白的。

  10. 点击订阅按钮。

    通知节点标签中显示接收到的通知数(0)。

  11. 在MBean树中展开Hello MBean的属性节点,并将CacheSize属性的值更改为150。

    在你启动Main的终端窗口中,会显示此属性更改的确认信息。请注意,通知节点中显示的接收到的通知数已经变为1。

  12. 再次展开MBean树中Hello MBean的通知节点。

    会显示通知的详细信息。

  13. 要关闭JConsole,选择Connection -> Exit。

上一页:上一课程
下一页:远程管理