Spec-Zone .ru
спецификации, руководства, описания, API
|
Содержание | Предыдущий | Следующий | Расширения управления Java (JMX) Технологическое Учебное руководство |
Эта глава представляет фундаментальное понятие Расширений управления Java (JMX) API, а именно, управляемые бобы, или MBeans.
MBean является управляемым объектом Java, подобным JavaBeanTM, который следует за шаблонами разработки, сформулированными в уровне инструментария спецификации JMX. MBean может представить устройство, приложение, или любой ресурс, которым нужно управлять. MBeans представляют интерфейс управления: ряд читаемых и/или перезаписываемых атрибутов и ряда invokable операции, наряду с самоописанием. Интерфейс управления не изменяется в течение жизни экземпляра MBean. MBeans может также испустить уведомления, когда определенные определенные события имеют место.
Спецификация JMX определяет четыре типа MBean: стандартные MBeans, динамический MBeans, открывают MBeans и модель MBeans. Примеры в этой главе демонстрируют самый простой тип MBean, а именно, стандартного MBeans.
Стандартный MBean определяется при записи вызванного интерфейса Java SomethingMBean
и Java class вызывают Something
это реализует тот интерфейс. Каждый метод в интерфейсе определяет или атрибут или работу в MBean. По умолчанию каждый метод определяет работу. Атрибуты и операции являются просто методами, которые следуют за определенными шаблонами разработки. Стандартный MBean составляется из интерфейса MBean, который перечисляет методы для всех представленных атрибутов и операций, и class, который реализует этот интерфейс и обеспечивает функциональность инструментованного ресурса.
Следующие разделы анализируют стандарт в качестве примера MBean, и простой агент JMX, который управляет MBean. Примеры кода берутся из каталога work_dir/jmx_examples/Essential/com/example/mbeans.
Пример очень основного интерфейса MBean, названного HelloMBean
, показывается в ПРИМЕРЕ КОДА 2-1.
package com.example.mbeans; public interface HelloMBean { public void sayHello(); public int add(int x, int y); public String getName(); public int getCacheSize(); public void setCacheSize(int size); }
Как утверждено ранее, условно интерфейс MBean берет имя Java class, который реализует это с суффиксным добавленным MBean. Так, в этом случае интерфейс вызывают HelloMBean
. Hello
class, который реализует этот интерфейс, описывается в Разделе "Реализация MBean".
Согласно спецификации JMX, интерфейс MBean состоит из именованных и введенных атрибутов, которые читаемы и возможно перезаписываемые, и названные и введенные операции, которые могут быть вызваны приложениями, которыми управляет MBean. HelloMBean
интерфейс, показанный в ПРИМЕРЕ КОДА 2-1, объявляет две операции: методы Java add()
и sayHello()
.
Из двух атрибутов, которые объявляются HelloMbean
, Name
строка только для чтения, и CacheSize
целое число, которое может быть и считано и записано. Метод get и методы метода set объявляются, чтобы позволить управляемое приложение доступу и возможно изменить значения атрибута. Как определено спецификацией JMX, метод get является любым открытым методом, имя которого начинается, добираются и который не возвращается пусто. Метод get позволяет менеджеру считать значение атрибута, тип которого является типом возвращенного объекта. Метод set является любым открытым методом, имя которого начинается с набора и который берет единственный параметр. Метод set позволяет менеджеру записать новое значение в атрибуте, тип которого является тем же самым как тем из параметра.
Реализацию этих операций и атрибутов показывают в следующем разделе.
Hello
class, показанный в ПРИМЕРЕ КОДА 2-1 реализация HelloMBean
.
package com.example.mbeans; public class Hello 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) { this.cacheSize = size; System.out.println("Cache size now " + this.cacheSize); } private final String name = "Reginald"; private int cacheSize = DEFAULT_CACHE_SIZE; private static final int DEFAULT_CACHE_SIZE = 200; }
Прямой Java class Hello
обеспечивает определения операций и приписывает объявленный HelloMBean
. Поскольку можно видеть, sayHello()
и add()
операции чрезвычайно просты, но реальные операции могут быть столь же простыми или столь же сложными, как Вам нравится.
Методы, чтобы добраться Name
атрибут и добраться и установить cacheSize
атрибут также определяется. В этом примере, Name
значение атрибута никогда не изменяется, но в реальном сценарии оно могло бы измениться, поскольку управляемый ресурс работает. Например, атрибут мог бы представить статистику, такую как использование памяти или время работы. Здесь, это - просто имя "Реджиналд".
Вызов setCacheSize
метод позволяет Вам изменяться cacheSize
атрибут от его объявленного значения по умолчанию 200. В действительности, изменение cacheSize
атрибут мог потребовать, чтобы другие операции были выполнены, такие как отбрасывание записей или выделение новых. Этот пример просто печатает сообщение, чтобы подтвердить, что размер кэша изменился, но более сложные операции могли быть определены вместо простого звонка println()
.
С простым Hello
MBean и его интерфейс, таким образом определенный, они могут теперь использоваться, чтобы управлять ресурсом, который они представляют, как показано в следующем разделе.
Как представлено в Расширениях управления Java (JMX) Технологический Краткий обзор, когда-то ресурс был инструментован MBeans, управлением тем ресурсом, выполняется агентом JMX.
Базовый компонент агента JMX является сервером MBean, сервером управляемого объекта, в котором регистрируются MBeans (см. документацию API для MBeanServer
интерфейс для деталей реализации сервера MBean). Агент JMX также включает ряд служб, чтобы управлять MBeans.
ПРИМЕР КОДА 2-1 подарок основной агент JMX, названный Main
.
package com.example.mbeans; import java.lang.management.*; import javax.management.*; public class Main { public static void main(String[] args) throws Exception { MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName name = new ObjectName("com.example.mbeans:type=Hello"); Hello mbean = new Hello(); mbs.registerMBean(mbean, name); System.out.println("Waiting forever..."); Thread.sleep(Long.MAX_VALUE); } }
Агент JMX Main
начинается, получая любой сервер MBean, который работает на платформе, вызывая getPlatformMBeanServer()
метод java.lang.management.ManagementFactory
class. Если нет никакого сервера MBean, уже работающего на платформе, то getPlatformMBeanServer()
создает тот автоматически, вызывая метод JMX MBeanServerFactory.createMBeanServer()
. MBeanServer
экземпляр, полученный Main
называется mbs
.
Затем, Main
определяет имя объекта для экземпляра MBean, который оно создаст. У каждого JMX MBean должно быть имя объекта. Имя объекта является экземпляром class JMX ObjectName
, и должен соответствовать синтаксису, определенному спецификацией JMX, а именно, это должно включить домен, и список ключевых свойств (см. документацию API для ObjectName
class для деталей этого синтаксиса). В имени объекта, определенном Main
, name
, домен com.example.mbeans
(пакет, в котором пример содержатся MBeans) и ключевое свойство объявляет, что этот объект имеет тип Hello
.
Экземпляр a Hello
объект создается, называется mbean
. Это Hello
объект является самостоятельно экземпляром MBean Hello
это было определено в Разделе "Реализация MBean".
Hello
объект называют mbean
тогда регистрируется как MBean в сервере MBean mbs
с именем объекта name
, передавая объект и имя объекта в звонок в метод JMX MBeanServer.registerMBean()
.
С Hello
MBean, зарегистрированный в сервере MBean, Main
будет просто ожидать операций управления, которые будут выполняться на Hello
. В пределах этого примера эти операции управления вызывают sayHello()
, и add()
, и добираясь и устанавливая значения атрибута.
Исследовав классы в качестве примера, можно теперь выполнить пример. Платформа Java, Standard Edition идет с управлением и контролирующей консолью, названной JConsole, который используется, чтобы взаимодействовать с MBean в этом примере. JConsole располагается в JavaSE_HOME/bin/jconsole
, в котором JavaSE_HOME является каталогом установки Платформы Java, Standard Edition (Java платформа SE).
Чтобы выполнить пример, следуйте за шагами ниже, или см. README
файл:
/jmx_examples/Essential
.
$
cd work_dir/jmx_examples/Essential
$
javac com/example/mbeans/*.java
Main
приложение.
$
java com.example.mbeans. Основной
Вы будете видеть подтверждение это Main
ожидает чего-то, чтобы произойти.
$
jconsole
Вы будете видеть, что инструмент JConsole открывается, представляя список выполнения агентов JMX, с которыми можно соединиться.
com.example.mbeans.Main
от списка в “Новом Соединении” окно, и щелкают, "Соединяются".
Вы будете видеть сводку текущего действия своей платформы.
Это телевикторины Вы весь MBeans в настоящий момент зарегистрировалось в сервере MBean.
com.example.mbeans
узел в дереве MBean.
Вы будете видеть пример MBean Hello
, это создавалось и регистрировалось Main
. Если Вы щелкаете Hello
, Вы будете видеть его связанные Атрибуты и узлы Операций в дереве MBean.
Hello
Узел MBean в дереве MBean.
Hello
Метаданные MBEAN и его связанный Дескриптор будут выведены на экран.
Attributes
узел Hello
MBean в дереве MBean.
Это выводит на экран атрибуты MBean, которые были определены Hello
class.
CacheSize
припишите 150
В окне терминала, в котором Вы запустили Main
, Вы будете видеть подтверждение этого изменения атрибута.
Operations
узел Привет MBean в дереве MBean.
Здесь Вы будете видеть эти две операции, объявленные Hello
MBean, sayHello()
и add()
.
sayHello()
работа, щелкая sayHello
кнопка.
Диалоговое окно JConsole сообщит Вам, что метод был вызван успешно, и Вы будете видеть сообщение “привет, мир” в окне терминала в который Main
работает.
add()
работа, чтобы сложить, и щелкнуть add
кнопка.
Вам сообщат об ответе в диалоговом окне JConsole.
MBeans может генерировать уведомления, например чтобы сигнализировать изменение состояния, обнаруженное событие, или проблему.
Для MBean, чтобы генерировать уведомления, это должно реализовать интерфейс NotificationBroadcaster
, или его подынтерфейс NotificationEmitter
. Все, что Вы должны сделать, чтобы отправить уведомление, должно создать экземпляр class javax.management.Notification
или подкласс (такой как AttributeChangedNotification
), и передача это к NotificationBroadcasterSupport.sendNotification
.
У каждого уведомления есть источник. Источник является именем объекта MBean, который испускал уведомление.
У каждого уведомления есть порядковый номер. Это число может использоваться, чтобы упорядочить уведомления, прибывающие из того же самого источника, когда порядок имеет значение и есть опасность уведомлений, обрабатываемых в неправильном порядке. Это в порядке для порядкового номера, чтобы быть нулем, но для этого лучше постепенно увеличиться для каждого уведомления от данного MBean.
Есть пример стандартного MBean, который испускает уведомления в каталоге work_dir/jmx_examples/Notification/com/example/mbeans
. Этим примером является по существу то же самое как пример, замеченный в Разделе "Стандартный MBeans", за исключением того, что Hello
MBean реализует NotificationBroadcaster
интерфейс.
Как указано выше единственной разницей между этим примером и тем, представленным в Разделе "Стандартный MBeans", является факт, что реализация MBean учитывает отправку уведомлений.
Уведомления активируются, реализовывая NotificationBroadcaster
интерфейс, как показано в ПРИМЕРЕ КОДА 2-1.
package com.example.mbeans; 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; }
Поскольку можно видеть в ПРИМЕРЕ КОДА 2-1, этом Hello
Реализация MBean расширяется NotificationBroadcasterSupport
class, который непосредственно реализует NotificationEmitter
интерфейс.
Операции и атрибуты устанавливаются таким же образом как прежде с единственным исключением что cacheSize
метод метода set атрибута теперь определяет новое значение oldSize
, который записывает cacheSize
значение атрибута до операции присвоения.
Уведомление создается из экземпляра, n
, из class JMX AttributeChangeNotification
, который расширяется javax.management.Notification
. Уведомление создается в пределах определения setCacheSize()
метод, от следующей информации, к которой передают AttributeChangeNotification
как параметры:
Hello
MBean, представленный просто this
sequenceNumber
, это устанавливается в 1, и это увеличивается с приращениемcacheSize
oldSize
this.cacheSize
Уведомление n тогда передают к NotificationBroadcasterSupport.sendNotification()
метод.
Наконец, MBeanNotification
определяется, чтобы описать характеристики различных экземпляров уведомления, испускаемых MBean для данного Java class уведомления, которое в этом случае является AttributeChangeNotification
уведомления.
Интерфейс MBean, HelloMBean
, и агент JMX Main
идентичны используемым в предыдущем примере.
Исследовав классы в качестве примера, можно теперь выполнить пример. Этот пример снова использует JConsole, чтобы взаимодействовать Hello
MBean. Чтобы выполнить пример, следуйте за шагами ниже, или см. README
файл:
/jmx_examples/Notification
.
$
cd work_dir/jmx_examples/Notification
$
javac com/example/mbeans/*.java
Main
приложение.
$
java com.example.mbeans. Основной
Вы будете видеть подтверждение это Main
ожидает чего-то, чтобы произойти.
$
jconsole
Вы будете видеть, что инструмент JConsole открывается, представляя список выполнения агентов JMX, с которыми можно соединиться.
com.example.mbeans.Main
от списка в “Новом Соединении” окно, и щелкают, "Соединяются".
Вы будете видеть сводку текущего действия своей платформы.
Это телевикторины Вы весь MBeans в настоящий момент зарегистрировалось в сервере MBean.
com.example.mbeans
узел в дереве MBean.
Вы будете видеть пример MBean Hello
, это создавалось и регистрировалось Main
. Если Вы щелкаете Hello
, Вы будете видеть его связанное Attributes
, Operations
и Notifications
узлы в дереве MBean.
Hello
Узел MBean в дереве MBean.
Это выводит на экран метаданные MBEAN и его связанный Дескриптор.
Notifications
узел Привет MBean в дереве MBean.
Вы будете видеть, что панель является пробелом.
Текущее число уведомлений, полученных (0), будет выведено на экран в метке узла Уведомлений.
Attributes
узел Hello
MBean в дереве MBean, и изменение значение CacheSize
припишите 150
В окне терминала, в котором Вы запустили Main
, Вы будете видеть подтверждение этого изменения атрибута. Вы будете также видеть, что число уведомлений, полученных выведенный на экран в узле Уведомлений, изменилось на 1.
Notifications
узел Hello
MBean в дереве MBean снова.
Вы будете видеть детали уведомления, которое было отправлено.
MXBean является новым типом MBean, который обеспечивает простой способ кодировать MBean, который только ссылается на предопределенный набор типов. Таким образом можно убедиться, что Ваш MBean будет применим любым клиентом, включая удаленные клиенты, без любого требования, чтобы у клиента был доступ к специфичным для модели классам, представляющим типы Вашего MBeans. MXBeans обеспечивают удобный способ связать связанные значения вместе, не требуя, чтобы клиенты были особенно сконфигурированы, чтобы обработать пакеты.
Таким же образом что касается стандартного MBeans, MXBean определяется при записи интерфейса Java под названием Что-тоMXBean
и Java class, который реализует тот интерфейс. Однако, в отличие от стандартного MBeans, MXBeans не требуют, чтобы Java class был вызван Something
. Каждый метод в интерфейсе определяет или атрибут или работу в MXBean. Аннотация @MXBean
может также использоваться, чтобы аннотировать интерфейс Java вместо того, чтобы требовать, чтобы имя интерфейса сопровождалось суффиксом MXBean.
MXBeans обеспечивают удобный способ связать связанные значения вместе в MBean, не требуя, чтобы клиенты были особенно сконфигурированы, чтобы обработать пакеты, взаимодействуя с этим MBean. MXBeans уже существовал в Java 2 Платформы, Standard Edition (J2SE) 5.0, в пакете java.lang.management
. С Java SE 6 платформ пользователи могут теперь определить свой собственный MXBeans, в дополнение к стандартному набору, определенному в java.lang.management
.
Ключевая идея позади MXBeans состоит в том что типы такой как java.lang.management.MemoryUsage
на это ссылаются в интерфейсе MXBean, java.lang.management.MemoryMXBean
в этом случае, отображаются в стандартный набор типов, так называемые Открытые Типы, которые определяются в пакете javax.management.openmbean
. Точные правила отображения появляются в спецификации MXBean, но упрощать мы могли сказать что простые типы как int
или String
неизменны, в то время как составные типы как MemoryUsage
будьте отображены на стандартный тип CompositeDataSupport
.
Работа MXBeans демонстрируется на примере программы, которые Вы найдете в каталоге work_dir/jmx_examples/MXBean/com/example/mxbeans
после того, как Вы загрузили и разархивировали jmx_examples.zip
файл. Пример MXBean содержит следующие файлы:
QueueSamplerMXBean
интерфейс.QueueSampler
class, который реализует интерфейс MXBean.QueueSample
Тип Java, возвращенный getQueueSample()
метод в интерфейсе MXBean.Main
, программа, которая устанавливает и выполняет пример.Пример MXBean выполняет следующие действия.
type Queue<String>
.getQueueSample
, в MXBean, который берет снимок очереди когда вызвано и возвращает Java class QueueSample
это связывает следующие значения вместе: ПРИМЕР КОДА 2-1 шоу код выборки QueueSamplerMXBean
интерфейс.
package com.example.mxbeans; public interface QueueSamplerMXBean { public QueueSample getQueueSample(); public void clearQueue(); }
Как можно видеть, Вы объявляете интерфейс MXBean точно таким же образом, как Вы объявляете стандартный MBean. QueueSamplerMXBean
интерфейс объявляет две операции, getQueueSample
и clearQueue
.
QueueSampler
class реализует QueueSamplerMXBean
интерфейс, как показано в ПРИМЕРЕ КОДА 2-1.
package com.example.mxbeans; import java.util.Date; import java.util.Queue; public class QueueSampler implements QueueSamplerMXBean { private Queue<String> queue; public QueueSampler(Queue<String> queue) { this.queue = queue; } public QueueSample getQueueSample() { synchronized (queue) { return new QueueSample(new Date(), queue.size(), queue.peek()); } } public void clearQueue() { synchronized (queue) { queue.clear(); } } }
Операции MXBean getQueueSample () и clearQueue () объявленный интерфейсом MXBean определяются в QueueSampler
. getQueueSample () работа просто возвращает экземпляр QueueSample
Тип Java, создаваемый со значениями, возвращенными java.util.Queue
методы peek()
и size()
и экземпляр java.util. Дата.
QueueSample
экземпляр, возвращенный QueueSampler
определяется в QueueSample
class, показанный в ПРИМЕРЕ КОДА 2-1.
package com.example.mxbeans; import java.beans.ConstructorProperties; import java.util.Date; public class QueueSample { private final Date date; private final int size; private final String head; @ConstructorProperties({"date", "size", "head"}) public QueueSample(Date date, int size, String head) { this.date = date; this.size = size; this.head = head; } public Date getDate() { return date; } public int getSize() { return size; } public String getHead() { return head; } }
В QueueSample
class, платформа MXBean призывает всех методов get QueueSample
преобразовать приведенный пример в a CompositeData
и использование @ConstructorProperties
аннотация, чтобы восстановить a QueueSample
экземпляр от a CompositeData
.
Определив MXBean взаимодействует через интерфейс и class, который реализует его, так же как тип Java, который возвращается, MXBean должен теперь быть создан и зарегистрирован в сервере MBean. Эти действия выполняются примером class Main
.
package com.example.mxbeans; import java.lang.management.ManagementFactory; import java.util.Queue; import java.util.concurrent.ArrayBlockingQueue; import javax.management.MBeanServer; import javax.management.ObjectName; public class Main { public static void main(String[] args) throws Exception { MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName name = new ObjectName("com.example.mxbeans:type=QueueSampler"); Queue<String> queue = new ArrayBlockingQueue<String>(10); queue.add("Request-1"); queue.add("Request-2"); queue.add("Request-3"); QueueSampler mxbean = new QueueSampler(queue); mbs.registerMBean(mxbean, name); System.out.println("Waiting..."); Thread.sleep(Long.MAX_VALUE); } }
Main
class получает платформу сервер MBean, создает имя объекта для MXBean QueueSampler
, создает a Queue
экземпляр для QueueSampler
MXBean, чтобы обработать, и каналы этот экземпляр Очереди к недавно создаваемому QueueSampler
MXBean. MXBean тогда регистрируется в сервере MBean точно таким же образом как стандартный MBean.
Чтобы выполнить пример, следуйте за шагами ниже, или см. README
файл:
/jmx_examples/MXBean
.
$
cd work_dir/jmx_examples/MXBean
$
javac com/example/mxbeans/*.java
Main
приложение.
$
java com.example.mxbeans. Основной
Вы будете видеть подтверждение это Main
ожидает чего-то, чтобы произойти.
$
jconsole
Вы будете видеть, что инструмент JConsole открывается, представляя список выполнения агентов JMX, с которыми можно соединиться.
com.example.mxbeans.Main
от списка в “Новом Соединении” окно, и щелкают, "Соединяются".
Вы будете видеть сводку текущего действия своей платформы.
Это телевикторины Вы весь MBeans в настоящий момент зарегистрировалось в сервере MBean.
com.example.mxbeans
узел в дереве MBean.
Вы будете видеть пример MBean QueueSampler
, это создавалось и регистрировалось Основным. Если Вы щелкаете QueueSampler
, Вы будете видеть его связанные Атрибуты и узлы Операций в дереве MBean.
Attributes
узел.
Вы будете видеть QueueSample
атрибут появляется в правой области с ее значением javax.management.openmbean.CompositeDataSupport
.
CompositeDataSupport
значение.
Можно видеть QueueSample
значения date
, head
и size
потому что платформа MXBean преобразовала QueueSample
экземпляр в CompositeData
. Если Вы определили QueueSampler
как Стандартный MBean, а не как MXBean, JConsole не нашел бы QueueSample
class, потому что это не было бы в его пути class. Если QueueSampler
был стандартный MBean, Вы получите a ClassNotFoundException
получая QueueSample
значение атрибута. Это демонстрирует полноценность использования MXBeans, соединяясь с агентами JMX через универсальные клиенты JMX, как JConsole.
Operations
узел.
Вы будете видеть кнопку, чтобы вызвать clearQueue
работа.
clearQueue
кнопка.
Вам сообщат, что метод был вызван успешно.
Attributes
узел снова и двойной щелчок по CompositeDataSupport
значение.
Очередь была сброшена теперь.
В этом примере JConsole использовался в качестве клиента JMX, но если Вы должны были получить доступ к своему MXBean программно в клиенте JMX, Вы пишете себя, тогда Вы могли сделать так одним из двух способов:
MBeanServer mbs = ...whatever...; ObjectName name = new ObjectName("com.example.mxbeans:type=QueueSampler"); CompositeData queueSample = (CompositeData) mbs.getAttribute(name, "QueueSample"); int size = (Integer) queueSample.get("size");
MBeanServer mbs = ...whatever...; ObjectName name = new ObjectName("com.example.mxbeans:type=QueueSampler"); QueueSamplerMXBean proxy = JMX.newMXBeanProxy(mbs, name, QueueSamplerMXBean.class); QueueSample queueSample = proxy.getQueueSample(); int size = queueSample.getSize();
ПРИМЕР КОДА 2-2 использования newMXBeanProxy метод, чтобы создать прокси MXBean. Эквивалентный метод, newMBeanProxy
, существует, чтобы создать прокси для других типов MBeans. newMBeanProxy
и newMXBeanProxy
методы используются точно таким же образом.
Дескрипторы позволяют Вам давать дополнительную информацию о MBeans клиентам управления. Например, Дескриптор на атрибуте MBean мог бы сказать, какие модули он измеряется в, или каковы его минимальные и максимальные возможные значения. С Java SE 6, Дескрипторы являются интегрированной частью API JMX и доступны во всех типах MBeans.
Дескрипторы дают Вам удобный способ присоединить произвольные дополнительные метаданные к Вашему MBeans. Дескрипторы всегда существовали в API JMX, но до Java SE 6, они были только доступны в соединении с Моделью MBeans.
Для большинства конструкторов в классах MBean*Info
(MBeanInfo
, MBeanAttributeInfo
, и так далее), параллельный конструктор существует с теми же самыми параметрами плюс дополнительное javax.management.Descriptor
параметр. То же самое является истиной для OpenMBean*InfoSupport
. MBean*Info
и OpenMBean*InfoSupport
классы содержат a getDescriptor()
метод.
Откройте информацию о возврате MBeans о значении по умолчанию и юридических значениях от getDefaultValue()
, getLegalValues()
, getMaxValue()
, getMinValue()
методы OpenMBeanParameterInfo
и OpenMBeanAttributeInfo
. Эта информация теперь также присутствует в соответствующих Дескрипторах, и другие типы MBean могут также возвратить информацию в своих Дескрипторах.
Дескрипторы MBean демонстрируются в классах в качестве примера, которые Вы найдете в каталоге work_dir/jmx_examples/Descriptors/com/example/mxbeans
после того, как Вы загрузили и разархивировали jmx_examples.zip
файл. Пример Дескриптора MBean содержит следующие файлы.
Author
, аннотация предоставления имя автора интерфейса MBean.DisplayName
, аннотация, которая предоставляет имя дисплея для методов в интерфейсе MBean.Main
, программа, которая устанавливает и выполняет пример.QueueSamplerMXBean
интерфейс.QueueSampler
class, который реализует интерфейс MXBean.QueueSample
Тип Java, возвращенный getQueueSample()
метод в интерфейсе MXBean.Version
, аннотация, которая предоставляет текущую версию интерфейса MBean. QueueSampler
MXBean в этом примере в основном выполняет те же самые действия как пример MXBean, представленный в Главе 2, "Представляя MXBeans", кроме с добавлением Дескрипторов MBean. Этот пример показывает как DescriptorKey
метааннотация может использоваться, чтобы добавить новые элементы дескриптора к Дескрипторам для стандартного MBean (или MXBean) через аннотации в стандартном MBean (или MXBean) интерфейс.
Новая аннотация DescriptorKey
может использоваться, чтобы добавить информацию к Дескрипторам для стандартного MBean (или MXBean) через аннотации в Стандартном MBean (или MXBean) интерфейс. Это позволяет инструменту, который генерирует стандартный MBeans от существующей модели управления, чтобы включать информацию от модели в сгенерированных интерфейсах MBean, а не в отдельных файлах.
ПРИМЕР КОДА 2-1 шоу определение аннотации Author
.
package com.example.mxbeans; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import javax.management.DescriptorKey; @Documented @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Author { @DescriptorKey("author") String value(); }
Эта аннотация предоставляет имя создателя интерфейса MBean. Новое поле author
будет добавлен к MBeanInfo
Дескриптор со значением, определенным @Author
аннотация. Файлы Version
и DisplayName
определите аннотации тех имен точно таким же образом что касается Author
выше. В каждом из Version
и DisplayName
, @DescriptorKey
значение “version”
и “displayname”
соответственно.
В случае Версии, нового поля version
будет добавлен к MBeanInfo
Дескриптор со значением, определенным @Version
аннотация.
Для DisplayName
, новое поле displayName
будет добавлен к MBeanAttributeInfo
Дескриптор или MBeanOperationInfo
Дескриптор со значением, определенным @DisplayName
аннотация в зависимости от того, является ли аннотируемый метод методом get/методом set или работой, соответственно.
QueueSamplerMXBean
интерфейс, используемый в этом примере, немного отличается от того, используемого в примере MXBeans, в том, столько, сколько это реализует Дескрипторы MBean, чтобы опубликовать часть его информации.
package com.example.mxbeans; @Author("Mr Bean") @Version("1.0") public interface QueueSamplerMXBean { @DisplayName("GETTER: QueueSample") public QueueSample getQueueSample(); @DisplayName("OPERATION: clearQueue") public void clearQueue(); }
Здесь, Вы видите что @Author
аннотация устанавливается в Mr. Bean
, @Version
аннотация устанавливается в 1.0
, и @DisplayName
устанавливается в имена любой из атрибута QueueSample
или работа clearQueue
.
Чтобы выполнить пример, следуйте за шагами ниже, или см. README
файл:
/jmx_examples/Descriptors
.
$
cd work_dir/jmx_examples/Descriptors
$
javac com/example/mxbeans/*.java
Main
приложение.
$
java com.example.mxbeans. Основной
Вы будете видеть подтверждение это Main
ожидает чего-то, чтобы произойти.
$
jconsole
Вы будете видеть, что инструмент JConsole открывается, представляя список выполнения агентов JMX, с которыми можно соединиться.
com.example.mxbeans.Main
от списка в “Новом Соединении” окно, и щелкают, "Соединяются".
Вы будете видеть сводку текущего действия своей платформы.
Это телевикторины Вы весь MBeans в настоящий момент зарегистрировалось в сервере MBean.
com.example.mxbeans
узел в дереве MBean.
Вы будете видеть пример MBean QueueSampler
, это создавалось и регистрировалось Основным. Если Вы щелкаете QueueSampler
, Вы будете видеть его связанные Атрибуты и узлы Операций в дереве MBean. Вы будете также видеть поля author
и version
в MBeanInfo
Таблица дескрипторов.
Attributes
и Operations
узлы под QueueSampler
Узел MBean.
Вы будете видеть отдельные Атрибуты и Операции.
QueueSample
узел.
Вы будете видеть поле displayName
в MBeanAttributeInfo
Таблица дескрипторов.
clearQueue
узел.
Вы будете видеть поле displayName
в MBeanOperationInfo
Таблица дескрипторов.
Содержание | Предыдущий | Следующий