Spec-Zone .ru
спецификации, руководства, описания, API
След: Расширения управления Java (JMX)
Урок: Удаленное управление
Создание Пользовательского Клиента JMX
Домашняя страница > Расширения управления Java (JMX) > Удаленное управление

Создание Пользовательского Клиента JMX

Предыдущие уроки в этом следе показали Вам, как создать технологию JMX MBeans и MXBeans, и зарегистрировать их в агенте JMX. Однако, все предыдущие примеры использовали существующий клиент JMX, JConsole. Этот урок будет демонстрировать, как создать Ваш собственный клиент JMX.

Пример пользовательского клиента JMX, Client включается в jmx_examples.zip. Этот клиент JMX взаимодействует с тем же самым MBean, MXBean и агентом JMX, как были замечены в предыдущих уроках. Из-за размера Client class, это будет исследовано в блоках в следующих разделах.

Импорт JMX Удаленные Классы API

Чтобы быть в состоянии создать соединения с агентами JMX, которые работают удаленно от клиента JMX, Вы должны использовать классы от javax.management.remote.

package com.example;
...

import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

public class Client {
...

Client class будет создавать JMXConnector экземпляры, для которых это будет нуждаться в a JMXConnectorFactory и a JMXServiceURL.

Создание Слушателя Уведомления

Клиент JMX нуждается в обработчике уведомления, чтобы прислушаться и обработать любые уведомления, которые могли бы быть отправлены MBeans, которые регистрируются в сервере агента JMX MBean. Обработчик уведомления клиента JMX является экземпляром NotificationListener интерфейс, как показано ниже.

... 

public static class ClientListener implements NotificationListener {

    public void handleNotification(Notification notification,
            Object handback) {
        echo("\nReceived notification:");
        echo("\tClassName: " + notification.getClass().getName());
        echo("\tSource: " + notification.getSource());
        echo("\tType: " + notification.getType());
        echo("\tMessage: " + notification.getMessage());
        if (notification instanceof AttributeChangeNotification) {
            AttributeChangeNotification acn =
                (AttributeChangeNotification) notification;
            echo("\tAttributeName: " + acn.getAttributeName());
            echo("\tAttributeType: " + acn.getAttributeType());
            echo("\tNewValue: " + acn.getNewValue());
            echo("\tOldValue: " + acn.getOldValue());
        }
    }
}    
...       

Этот слушатель уведомления определяет источник любых уведомлений, которые он получает, и получает информацию, хранившую в уведомлении. Это тогда выполняет различные действия с информацией об уведомлении согласно типу полученного уведомления. В этом случае, когда слушатель получает уведомления о типе AttributeChangeNotification это получит имя и тип атрибута MBean, который изменился, так же как его старые и новые значения, вызывая AttributeChangeNotification методы getAttributeName, getAttributeType, getNewValue и getOldValue.

Новое ClientListener экземпляр создается позже в коде.

 
ClientListener listener = new ClientListener();

Создание Клиента Соединителя RMI

Client class создает клиент соединителя RMI, который конфигурируется, чтобы соединиться с сервером соединителя RMI, который Вы запустите, когда Вы запустите агент JMX, Main. Это позволит клиенту JMX взаимодействовать с агентом JMX, как будто они работали на той же самой машине.

...
    
public static void main(String[] args) throws Exception {

echo("\nCreate an RMI connector client and " +
    "connect it to the RMI connector server");
JMXServiceURL url = 
    new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:9999/jmxrmi");
JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
...        

Поскольку можно видеть, Client определяет a JMXServiceURL именованный url, это представляет расположение, в котором клиент соединителя ожидает находить сервер соединителя. Этот URL позволяет клиенту соединителя получать тупик сервера соединителя RMI jmxrmi от реестра RMI, работающего на порту 9999 из локального узла, и соединяться с сервером соединителя RMI.

С реестром RMI, таким образом идентифицированным, может быть создан клиент соединителя. Клиент соединителя, jmxc, экземпляр интерфейса JMXConnector, создаваемый connect() метод JMXConnectorFactory. connect() метод передают параметры url и нулевая среда отображается, когда ее вызывают.

Соединение с Удаленным Сервером MBean

С соединением RMI на месте, клиент JMX должен соединиться с удаленным сервером MBean, так, чтобы это могло взаимодействовать с различным MBeans, зарегистрированным в этом удаленным агентом JMX.

...
        
MBeanServerConnection mbsc = 
    jmxc.getMBeanServerConnection();
                
...     

Экземпляр MBeanServerConnection, названный mbsc, тогда создается, вызывая getMBeanServerConnection() метод JMXConnector экземпляр jmxc.

Клиент соединителя теперь соединяется с сервером MBean, создаваемым агентом JMX, и может зарегистрировать MBeans и выполнить операции на них с соединением, остающимся абсолютно прозрачным к обоим концам.

Чтобы запуститься с, клиент определяет некоторые простые операции, чтобы обнаружить информацию о MBeans, найденном в сервере агента MBean.

...
        
echo("\nDomains:");
String domains[] = mbsc.getDomains();
Arrays.sort(domains);
for (String domain : domains) {
    echo("\tDomain = " + domain);
}
        
...
        
echo("\nMBeanServer default domain = " + mbsc.getDefaultDomain());

echo("\nMBean count = " +  mbsc.getMBeanCount());
echo("\nQuery MBeanServer MBeans:");
Set<ObjectName> names = 
    new TreeSet<ObjectName>(mbsc.queryNames(null, null));
for (ObjectName name : names) {
    echo("\tObjectName = " + name);
}
      
...
        

Клиент вызывает различные методы MBeanServerConnection чтобы получить домены, в которых различные MBeans работают, число MBeans, зарегистрированного в сервере MBean, и именах объектов для каждого из MBeans, это обнаруживает.

Выполнение Операций на Удаленном MBeans через Прокси

Клиент получает доступ Hello MBean в сервере MBean через соединение сервера MBean, создавая прокси MBean. Этот прокси MBean локален для клиента, и эмулирует удаленный MBean.


...

ObjectName mbeanName = new ObjectName("com.example:type=Hello");
HelloMBean mbeanProxy = JMX.newMBeanProxy(mbsc, mbeanName, 
                                          HelloMBean.class, true);

echo("\nAdd notification listener...");
mbsc.addNotificationListener(mbeanName, listener, null, null);

echo("\nCacheSize = " + mbeanProxy.getCacheSize());

mbeanProxy.setCacheSize(150);

echo("\nWaiting for notification...");
sleep(2000);
echo("\nCacheSize = " + mbeanProxy.getCacheSize());
echo("\nInvoke sayHello() in Hello MBean...");
mbeanProxy.sayHello();

echo("\nInvoke add(2, 3) in Hello MBean...");
echo("\nadd(2, 3) = " + mbeanProxy.add(2, 3));

waitForEnterPressed();
        
...
        

Прокси MBean позволяют Вам получать доступ к MBean через интерфейс Java, разрешая Вам сделать запросы к прокси вместо того, чтобы иметь необходимость записать длинный код, чтобы получить доступ к удаленному MBean. MBean проксирует для Hello создается здесь, вызывая метод newMBeanProxy() в javax.management.JMX class, передавая это MBean's MBeanServerConnection, имя объекта, имя class MBean взаимодействует через интерфейс и true, показать, что прокси должен вести себя как a NotificationBroadcaster. Клиент JMX может теперь выполнить операции, определенные Hello как будто они были операциями локально зарегистрированного MBean. Клиент JMX также добавляет слушателя уведомления и изменяет MBean's CacheSize атрибут, чтобы заставить это отправить уведомление.

Выполнение Операций на Удаленном MXBeans через Прокси

Можно создать прокси для MXBeans точно таким же образом, как Вы создаете прокси MBean.

...
        
ObjectName mxbeanName = new ObjectName ("com.example:type=QueueSampler");
QueueSamplerMXBean mxbeanProxy = JMX.newMXBeanProxy(mbsc, 
    mxbeanName,  QueueSamplerMXBean.class);
QueueSample queue1 = mxbeanProxy.getQueueSample();
echo("\nQueueSample.Date = " + queue1.getDate());
echo("QueueSample.Head = " + queue1.getHead());
echo("QueueSample.Size = " + queue1.getSize());
echo("\nInvoke clearQueue() in QueueSampler MXBean...");
mxbeanProxy.clearQueue();

QueueSample queue2 = mxbeanProxy.getQueueSample();
echo("\nQueueSample.Date = " +  queue2.getDate());
echo("QueueSample.Head = " + queue2.getHead());
echo("QueueSample.Size = " + queue2.getSize());

...

Как показано выше, чтобы создать прокси для MXBean, все, что необходимо сделать, вызвать JMX.newMXBeanProxy вместо newMBeanProxy. Прокси MXBean mxbeanProxy позволяет клиенту вызывать QueueSample Операции MXBEAN, как будто они были операциями локально зарегистрированного MXBean.

Закрытие Соединения

Как только клиент JMX получил всю информацию, она нуждается и выполняла все необходимые операции на MBeans в сервере удаленного агента JMX MBean, соединение должно быть закрыто.


jmxc.close();

Соединение закрывается со звонком JMXConnector.close метод.

Выполнять Пользовательский Клиентский Пример JMX

Этот пример требует версии 6 Java платформа SE. Контролировать Main Агент JMX, удаленно используя пользовательский клиент JMX Client, следуйте за этими шагами:

  1. Если Вы так уже не сделали, сохранить jmx_examples.zip в Ваш work_dir каталог.
  2. Разархивируйте пакет демонстрационных классов при использовании следующей команды в окне терминала.
    unzip jmx_examples.zip
    
  3. Скомпилируйте классы Java в качестве примера изнутри work_dir каталог.
    javac com/example/*.java
    
  4. Запустите Main приложение, определяя свойства, которые представляют Main для удаленного управления:
    java -Dcom.sun.management.jmxremote.port=9999 \
         -Dcom.sun.management.jmxremote.authenticate=false \
         -Dcom.sun.management.jmxremote.ssl=false \ 
         com.example.Main
    

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

  5. Запустите Client приложение в различном окне терминала:
    java com.example.Client
    

    Подтверждение, что MBeanServerConnection был получен выводится на экран.

  6. Нажатие Входит.

    Домены те, в который все MBeans, которые регистрируются в сервере MBean, запущенном Main выводятся на экран.

  7. Нажатие Входит снова.

    Число MBeans, которые регистрируются в сервере MBean, выводится на экран, так же как имена объектов всех этих MBeans. Выведенные на экран MBeans включают всю стандартную платформу MXBeans, работающий в Java VM, так же как Hello MBean и QueueSampler MXBean, которые были зарегистрированы в сервере MBean Main.

  8. Нажатие Входит снова.

    Hello Операции MBEAN вызываются Client, со следующими результатами:

    • Слушатель уведомления добавляется к Client прислушиваться к уведомлениям от Main.
    • Значение CacheSize атрибут изменяется от 200 до 150.
    • В окне терминала, в котором Вы запустили Main, подтверждение CacheSize изменение атрибута выводится на экран.
    • В окне терминала, в котором Вы запустили Client, уведомление от Main выводится на экран, сообщая Client из CacheSize изменение атрибута.
    • Hello MBean's sayHello работа вызывается.
    • В окне терминала, в котором Вы запустили Main, сообщение "Привет мир" выводится на экран.
    • Hello MBean's add работа вызывается со значениями 2 и 3 как параметры. Результат выводится на экран Client.
  9. Нажатие Входит снова.

    QueueSampler Операции MXBEAN вызываются Client, со следующими результатами:

    • QueueSample значения date, head, и size выводятся на экран.
    • clearQueue работа вызывается.
  10. Нажатие Входит снова.

    Client закрывает соединение с сервером MBean, и подтверждение выводится на экран.


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

Предыдущая страница: Представление Ресурса для Удаленного управления JConsole
Следующая страница: Конец Следа