Java Management Extensions (JMX) — это технология, входящая в J2SE начиная с J2SE 5.0. JMX предназначен для контроля и управления приложениями, системными объектами, устройствами (например, принтерами) и компьютерными сетями. Она позволяет управлять внутренним состоянием так называемых MBean-ов, которые по сути являются классами Java, предоставляющими доступ к части своих полей и методов извне.
Разумеется, для того чтобы лучше представлять, что это такое, нужно написать небольшое приложение.
Стандартный MBean определяется с помощью интерфейса с именем <имя>MBean и его реализацией <имя> соответственно. Интерфейс определяет все экспортируемые наружу методы и атрибуты MBean-а. Атрибуты должны следовать правилам именования getter-ов и setter-ов.
Напишем простой интерфейс для MBean-а:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package ru.urvanov.javaexamples.mbeans; public interface MyMBean { String getMyName(); void setSomeValue(int value1); int getSomeValue(); void writeToConsole(String message); String concat(String str1, String str2); } |
В этом интерфейсе мы просто указываем, что наш MBean будет экспортировать поле myName (только для чтения) и поле someValue, а также метод writeToConsole и метод concat.
Реализуем этот интерфейс с помощью класса My (название нужно выбирать в соответствии с тем, что было написано до MBean в названии интерфейса):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
package ru.urvanov.javaexamples.mbeans; public class My implements MyMBean { private int someValue; @Override public String getMyName() { return "JustMBeanName" + someValue; } @Override public void setSomeValue(int value1) { this.someValue = value1; } @Override public int getSomeValue() { return this.someValue; } @Override public void writeToConsole(String message) { System.out.println(message); } @Override public String concat(String str1, String str2) { return str1 + str2; } } |
Интерфейс MyMBean и его реализация My вместе и есть то, что мы называем MBean.
Теперь нам нужно добавить наш MBean в MBeanServer, который является частью так называемого JMX agent.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
package ru.urvanov.javaexamples.mbeans; import java.lang.management.ManagementFactory; import javax.management.InstanceAlreadyExistsException; import javax.management.MBeanRegistrationException; import javax.management.MBeanServer; import javax.management.MalformedObjectNameException; import javax.management.NotCompliantMBeanException; import javax.management.ObjectName; /** * * Example from <a href="https://urvanov.ru">https://urvanov.ru</a> */ public class App { public static void main( String[] args ) throws MalformedObjectNameException, InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException, InterruptedException { MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName name = new ObjectName("ru.urvanov.javaexamples.mbeans:type=My"); My mbean = new My(); mbs.registerMBean(mbean, name); System.out.println("Waiting forever..."); Thread.sleep(Long.MAX_VALUE); } } |
Здесь стоит обратить внимание на класс ObjectName, с помощью которого мы задаём имя MBean-а. Это имя мы будем видеть JConsole. Имя должно быть задано в соответствии с правилом:
домен:ключ=значение, ключ=значение…
В качестве домена принято использовать имя пакета.
Запустите на исполнение класс App.
Запустите JConsole. Он является частью J2SE и располагается в подкаталоге “bin” каталога, в котором установлена Java. Например, для Windows это может быть что-то вроде C:\Program Files\Java\jdk1.8.0_91.
Выберите наше запущенное приложение и кликните по кнопке “Connect”.
Перейдите во вкладку “MBeans” и раскройте в левом дереве ветку соответствующую нашему MBean-у:
Далее:
- Выберите в дереве узел “someValue” и измените значение в столбце “Value” в таблице “Attribute value”.
- Выберите в дереве узел “concat”, введите значения и кликните по кнопке “concat”. В диалоговом окне должен отобразиться результат вызова метода.
- Выберите в дереве узел “writeToValue”, введите строку и кликните по кнопке “writeToValue”. В консоли запущенного приложения “App” должно отобразиться введённое сообщение.
Скачать ZIP-архив с исходниками
возможно, понадобится добавить в параметры запуска ip своей локальной машины
-Djava.rmi.server.hostname=127.0.0.1
иначе jconsole отдает Connection Failed: Retry