Spec-Zone .ru
спецификации, руководства, описания, API
След: Расширения управления Java (JMX)

Урок: Уведомления

API JMX определяет механизм, чтобы позволить MBeans генерировать уведомления, например, сигнализировать изменение состояния, обнаруженное событие, или проблему.

Чтобы генерировать уведомления, MBean должен реализовать интерфейс NotificationEmitter или расширитесь NotificationBroadcasterSupport. Чтобы отправить уведомление, Вы должны создать экземпляр class 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("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 class. NotificationBroadcasterSupport реализации NotificationEmitter интерфейс.

Операции и атрибуты устанавливаются таким же образом как в стандартном примере MBean, за исключением того, что CacheSize метод метода set атрибута теперь определяет значение oldSize. Это значение записывает CacheSize значение атрибута до операции присвоения.

Уведомление создается из экземпляра, n, из class JMX AttributeChangeNotification, который расширяется javax.management.Notification. Уведомление создается в пределах определения setCacheSize() метод от следующей информации. К этой информации передают AttributeChangeNotification как параметры.

Уведомление n тогда передается к NotificationBroadcasterSupport.sendNotification() метод.

Наконец, MBeanNotificationInfo экземпляр определяется, чтобы описать характеристики различных экземпляров уведомления, сгенерированных MBean для данного типа уведомления. В этом случае тип отправленных уведомлений AttributeChangeNotification уведомления.

Выполнение Примера Уведомления MBean

Еще раз Вы будете использовать JConsole, чтобы взаимодействовать Hello MBean, на сей раз чтобы передаться и получить уведомления. Этот пример требует версии 6 Java платформа SE.

  1. Если Вы так уже не сделали, сохранить jmx_examples.zip в Ваш work_dir каталог.
  2. Разархивируйте пакет демонстрационных классов при использовании следующей команды в окне терминала.
    unzip jmx_examples.zip
    
  3. Скомпилируйте классы Java в качестве примера изнутри work_dir каталог.
    javac com/example/*.java
    
  4. Запустите Main приложение.
    java com.example.Main
    

    Подтверждение это Main ожидает чего-то, чтобы произойти, сгенерирован.

  5. Запустите JConsole в различном окне терминала на той же самой машине.
    jconsole
    

    Новое диалоговое окно Соединения выводится на экран, представляя список выполнения агентов JMX, с которыми можно соединиться.

  6. В Новом диалоговом окне Соединения выбрать com.example.Main от списка и щелкают по Connect.

    Сводка текущего действия Вашей платформы выводится на экран.

  7. Щелкните по вкладке MBeans.

    Это телевикторины все MBeans, которые в настоящий момент регистрируются в сервере MBean.

  8. В левом фрейме расширьтесь com.example узел в дереве MBean.

    Вы видите пример MBean Hello это создавалось и регистрировалось Hello. Если Вы щелкаете Hello, Вы видите его узел Уведомлений в дереве MBean.

  9. Разверните узел Уведомлений Hello MBean в дереве MBean.

    Отметьте, что панель является пробелом.

  10. Нажмите кнопку Subscribe.

    Текущее число уведомлений, полученных (0), выводится на экран в метке узла Уведомлений.

  11. Разверните узел Атрибутов Hello MBean в дереве MBean, и изменение значение CacheSize припишите 150.

    В окне терминала, в котором Вы запустили Main, подтверждение этого изменения атрибута выводится на экран. Отметьте, что число полученных уведомлений, выведенных на экран в узле Уведомлений, изменилось на 1.

  12. Разверните снова узел Уведомлений Hello MBean в дереве MBean.

    Детали уведомления выводятся на экран.

  13. Чтобы закрыть JConsole, выберите Соединение-> Выход.

Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Предыдущий Урок
Следующая страница: Удаленное управление