...
...
...

практическое введение в JMX

Что такое JMX? Если вы думаете, что это еще один побочный фреймворк, не заслуживающий вашего внимания, то вы глубоко заблуждаетесь. Java Management eXtensions (JMX) – это фактически одна из самых основных функциональных частей современного процесса разработки и управления приложениями. Эту технологию сегодня используют такие производители J2EE-серверов, как JBoss, WebLogic и многие другие. Ниже мы рассмотрим структуру JMX и примеры использования этой технологии вместе с JSP. После прочтения этого материала вы без проблем сможете встраивать функциональность JMX в свои собственные приложения.

введение в JMX

Технология JMX (Java Management eXtensions) – это сравнительно новый стандарт компании Sun Microsystems, который позволяет Java-разработчикам интегрировать свои приложения с существующими решениями сетевого управления. JMX определяет стандарт для написания JMX-объектов, так называемых MBean’ов. MBean’ы «живут» внутри своего контейнера. Таким образом, любой JMX-клиент (в качестве которого может выступать, например, удаленное или локальное приложение) имеет возможность вызывать методы и получать доступ к атрибутам этим MBean’ов с помощью контейнера, в котором они содержатся. Кроме того, приложение также может получать специальные уведомления от MBean’ов, если это приложение зарегистрирует соответствующие “слушающие” MBean’ы.

Управление конфигурацией любого сервера приложений может оказаться бренной задачей, и большинство проектов просто не включают в цикл разработки конфигурационный фреймворк. В этом случае JMX приходит на помощь: теперь в вашем распоряжении есть фреймворк многократного использования для внедрения в ваши приложения функций удаленных и локальных инструментов управления. JMX позволяет запрашивать конфигурационные установки и изменять их во время выполнения приложения. Кроме этого JMX предоставляет и другие сервисы, такие как, например, мониторинг, уведомления о событиях, таймер и динамическая загрузка классов из XML-файлов. Вы можете использовать JMX для загрузки, инициализации, изменения и мониторинга ваших приложений и их распределенных компонентов.
Подробная спецификация технологии JMX находится в документе JSR-000003 (www.jcp.org).





Предлагаемую вашему вниманию статью условно можно разделить на две части: в первой мы рассмотрим архитектуру технологии JMX, а затем обратимся к примерам использования JMX вместе с технологией JSP с помощью сервера приложений JBoss и сервлет-контейнера Tomcat.

архитектура JMX

Архитектура технологии JMX строится на трехуровневой модели. Выделяются три логических слоя: instrumentation, agent и слой распределенных сервисов (управляющий слой). Поскольку технология JMX строилась с учетом уже существующих технологий управления, она также предоставляет интерфейсы к самым широко распространенным на сегодняшний день протоколам: программные интерфейсы для дополнительных протоколов управления предоставляют средства взаимодействия с другими средами управления. Понятно, что цель этих интерфейсов – более тесная интеграция с уже существующими решениями в сфере управления приложениями.

слой instrumentation

Этот слой трактует приложение как один или несколько управляемых компонентов MBean’ов (Managed Bean). Каждый MBean предоставляет возможность управлять своим состоянием с помощью общедоступных public-методов. MBean’ом может быть любой Java-объект, который вы модифицируете так, чтобы он поддерживал интерфейсы и семантику, определенную в спецификации JMX. MBean’ы бывают четырех типов: standard, dynamic, open и model:
1. Standard MBean обеспечивает статический (static) интерфейс.
2. Dynamic MBean передает свой интерфейс JMX-агенту во время выполнения приложения с использованием метаданных.
3. Open MBean – это тот же dynamic MBean, но который использует предопределенные типы данных Java таким образом, что зависимости от других классов ослабляются, позволяя улучшить производительность и динамическое поведение этого компонента.
4. Model MBean – как следует из названия – это общий и настраиваемый MBean, который поставляется с каждой реализацией JMX. Вы можете создать экземпляр и использовать model MBean’ы вместо определения своих собственных MBean-классов.

Standard MBean – это наиболее распространенный тип. Например, предположим, что у вас есть класс с именем Logger, который формирует отладочные сообщения вашего приложения, при этом содержит в себе поля для имени журнального файла (в который будут заноситься эти сообщения) и уровня подробности сообщений. Мы может завернуть этот класс Logger в MBean типа standard, создав новый интерфейс с именем LoggerMBean. В этом интерфейсе мы добавляем общедоступные (public) getter- и setter-методы для установки и изменения значений имени файла и уровня подробности сообщений. Эти методы для изменения атрибута имени файла могут называться, например, setFilename() и getFilename(). И, наконец, классу Logger нужно реализовать интерфейс LoggerMBean так, чтобы агент JMX смог самостоятельно все проанализировать и сгенерировать метаданные о MBean’е класса Logger. Этот MBean управляется с помощью агента JMX вызовами методов, определенных в интерфейсе (в нашем случае интерфейсе LoggerMBean). В общем случае MBean – это связь между управляемым ресурсом (вашим приложением) и остальным фреймворком JMX.

слой agent

Следующий наиболее интересный слой фреймворка JMX – это слой agent. Агент (agent) предоставляет удаленный доступ к управлению приложением всем своим зарегистрированным MBean’ам. Можно смело сказать, что это центральная часть фреймуорка JMX. Агент также обеспечивает дополнительные сервисы, типа мониторинга и динамической загрузки классов. Эти сервисы также являются зарегистрированными MBean’ами. Основной компонент агента называется MBean-сервером и определяется интерфейсом javax.management.MBeanServer. Для того чтобы создать сервер, вы должны вызвать статический метод createMBeanServer() класса MBeanServerFactory. Этот класс-фабрика хранит также ссылки на все MBean-серверы, которые были созданы раньше. Поэтому от вас не требуется кэшировать их. Найти ссылку на нужный MBean-сервер вы можете с помощью метода findMBeanServer().

cлой распределенных сервисов (distributed services)

Последний из рассматриваемых нами слоев – это слой распределенных сервисов управления. Этот слой обеспечивает интерфейс, который удаленные инструменты используют для взаимодействия с агентами.

Итак, мы очень кратко рассмотрели структуру фреймворка JMX, получили некоторые сведения о том, зачем он нужен и как он функционирует. Следующим этапом мы разберем практическое использование этой технологии на конкретном примере.

JMX и JSP

В нашем примере мы будем использовать Tomcat и JBoss в качестве серверов приложений, поэтому вам необходимо сначала установить их. Просто следуйте следующим шагам:
1. Скачайте Tomcat и JBoss в одном дистрибутиве с веб-сайта SourceForge.net (сайт
2. Скопируйте файл tools.jar из директории lib вашей JDK в директорию lib сервера Tomcat. Это необходимо для компиляции JSP-страниц при работе сервера Tomcat интегрированного с JBoss. Альтернативный вариант – добавить библиотеку tools.jar в переменную окружения CLASSPATH.
3. Скопируйте файл jmxri.jar из директории lib установленного сервера JBoss в директорию lib сервера Tomcat. Это JAR-файл содержит JMX-классы, которые мы будем использовать для написания нашей JSP-страницы.
4. Протестируйте работу сервера, выполнив из командной сроки команду run.bat для Windows-систем или run.sh для Linux, находясь в директории bin сервера JBoss. Там вы должны будете увидеть консольное сообщение о запуске еще и встроенного сервера Tomcat, как части процесса запуска. Чтобы завершить запуск нажмите Ctrl-C.

Технология JMX может использоваться вместе с JSP, чтобы предоставить простой способ управления приложениями. Приведенный ниже пример, выполненный в виде кода JSP, работает с JMX-агентом (или MBean-сервером), который находится внутри сервера JBoss. Возьмите листинг этой программы и сохраните его под именем, например, JMXExample1.jsp и скопируйте его в директорию webapps/JMXExamples (предварительно ее создав) относительно корневой директории вашего сервера Tomcat (убедитесь, что вы запустили JBoss). И введите в вашем браузере следующий адрес:сайт

Листинг 1.

<%@
page
import="javax.management.*,java.util.*"
%>
<%
try {

// Получаем ссылку на MBean-сервер
ArrayList mbservs = MBeanServerFactory.findMBeanServer(null);
if (mbservs == null)
throw new Exception("Ни один MBean-сервер не обнаружен.");
MBeanServer srv = (MBeanServer)mbservs.get(0);

// Создаем объект для идентификации MBean’а
ObjectName objName = new ObjectName("DefaultDomain:service=Logging,type=File");

// Обновляем наш MBean новым именем журнального файла
String newValue = (String)request.getParameter("LogName");
if (newValue != null && newValue.length() > 0) {
Attribute attr = new Attribute("LogName", newValue);
srv.setAttribute(objName, attr);
}

// Получаем последнее значение атрибута имени журнального файал
String value = (String)srv.getAttribute(objName, "LogName");
%>

MBean <%= objName.getCanonicalName() %>

<FORM METHOD="post" ACTION="JMXExample1.jsp">
<TABLE BGCOLOR="gray" ALIGN="left" BORDER="1" WIDTH="50%" CELLPADDING="3">
<TR>
<TH WIDTH="25%"> Атрибут </TH><TH WIDTH="35%"> Значение </TH>
</TR>
<TR>
<TD><B>LogName</B></A></TD>
<TD><INPUT TYPE="text" NAME="LogName" VALUE="<%= value %>" SIZE="34%"></TD>
</TR>
<TR>
<TD ALIGN=LEFT><INPUT TYPE="submit" VALUE="Обновить"></TD>
</TR>
</TABLE>
</FORM>


<%
} catch (Exception e) {
e.printStackTrace();
}
%>

Как результат работы этой JSP-страницы, в вашем браузере должно появиться что-то похожее на следующее изображение:



Рисунок 1. Результат выполнения кода JSP.

На рисунке 1 показан атрибут LogName класса org.jboss.logging.FileLoggingMBean. Этот атрибут представляет имя журнального файла сервера JBoss. Сейчас попробуйте изменить значение текстового поля на, например, “newlogfile” и нажмите на кнопку “Обновить”. Теперь зайдите в директорию dist/log относительно корневой директории установленного сервера JBoss. Там вы увидите новый журнальный файл с именем newlogfile.

Нажатие на кнопку “Обновить” вызывает метод setAttribute() MBean-сервера, который поручает этот вызов методу setLogName() интерфейса FireLoggingMBean. Следует учесть, что MBean-сервер, JBoss и JSP-страница работают внутри одной и той же виртуальной Java-машины (JVM). Используя этот же подход, вы без труда можете интегрировать JMX с вашими собственными приложениями. Все что вам нужно – это создать MBean- сервер, зарегистрировать в нем ваши MBean’ы и после этого написать свою JSP-страницу или любое другое приложение, которым вы хотите осуществлять управление. Это самый простой способ добавления функциональности технологии JMX в ваш, уже существующий проект.

Альтернативный подход состоит в использовании класса HtmlAdapterServer из стандартной реализации JMX, вместо разработки вашей собственной JSP- страницы. Этот класс находится в файле jmxtools.jar. HtmlAdapterServer – это тоже MBean-компонент. Пример того, как выглядит страница управления с помощью этого класса вы можете посмотреть, запустив сервер JBoss и введя в адресной строке вашего браузере адрессайт
как это все работает?

Итак, сейчас мы более подробно рассмотрим все операции, которые мы выполняли.
1. На первом этапе мы получаем ссылку на MBean-сервер с помощью вызова статического метода findMBeanServer(null) класса-фабрики
MBeanServerFactory. Передача значения null в качестве параметра этому методу означает, что вы хотите получить все серверы известные данному классу-фабрике. В нашем случае нам нужен только один единственный от JBoss. Когда вы используете интерфейс MBean-сервера, вам нужно определить какому MBean’у вы собираете посылать сообщения (т.е. чьи методы вы будете вызывать).
2. Далее мы создаем объект класса ObjectName. В качестве параметра его конструктору мы передаем каноническое имя нашего MBean’а. Шаблон имени состоит из домена (domain), который может быть либо DefaultDomain, либо какой-то свой домен. За доменом следуют пары<свойство=значение>, разделенные запятыми. Здесь нужно указать как минимум одну такую пару. Формат шаблона в общем виде выглядит следующим образом:

[имяДомена]:свойство=значение[,свойство=значение]*

3. На третьем этапе мы обновляем FileLoggingMBean новым значением имени журнального файла, которое было передано JSP-странице. Для этого мы создаем объект класса Attribute фреймворка JMX и передаем его конструктору в качестве параметров имя атрибута и его значение. После этого мы вызываем метод setAttribute() MBean-сервера, передавая ему созданные нами ранее объекты классов Attribute и ObjectName, как параметры. Эти параметры помогают понять, с каким MBean’ом мы будем иметь дело, а также задают атрибут и его значение. Метод setAttribute() будет использовать метаданные MBean’а, хранящиеся на MBean-сервере, чтобы вызвать подходящий setter-метод этого MBean’а.
4. И, наконец, мы получаем с помощью метода getAttribute() значение атрибута из FileLoggerMBean. Этому методу мы передаем параметры: объект класса ObjectName и имя атрибута в виде строки String. Вам также нужно привести тип возвращаемого объекта к тому, что возвращает getter-метод. Этот тип определен, естественно, в интерфейсе FileLoggerMBean.

дополнительные возможности JMX

JMX позволяет выполнять гораздо больше функций, чем простой фреймворк удаленного управления. Он предоставляет дополнительные сервисы, которые вы можете сделать основной частью вашего процесса разработки. Ниже приведем небольшой список этих возможностей:
- Уведомления о событиях. Интерфейсы снабжены возможностью распространения уведомлений среди “слушателей” (listeners) событий. Событием может являться, например, изменение атрибута. Это позволяет MBean’ам взаимодействовать с другими MBean’ами или удаленным менеджером и оповещать друг друга об изменениях состояния.
- Мониторинг. Monitor MBeans могут посылать уведомления о событиях зарегистрированным у них “слушателям”. “Слушателем” может быть другой MBean или приложение. Целевыми объектами наблюдений за атрибутами могут быть: counter, gauge и string. Подробнее о них вы можете прочитать в спецификации.
- Таймер. Timer MBean будет посылать уведомления зарегистрированным “слушателям” по наступлению определенного времени или истечению заданного интервала.

резюме

JMX – это значимый и крайне полезный фреймуорк, который вы уже сейчас можете с минимальными усилиями интегрировать с вашими приложениями. Кроме этого JMX может легко интегрироваться с уже существующими технологиями управления, например, SNMP, а также технологиями будущего, например, CIM/WBEM.



Алексей Литвинюк, litvinuke at tut.by.
обсуждение статьи



© Сетевые решения